![]() |
Zufallszahl mit Kommerstellen
Was mache ich bloß falsch? Mein Ziel ist es eine Zufallszahl zu erstellen zwischen 0 und 1.
Das Ergebniss soll in Kommerstellen ausgegenen werden. (zB. 0,9786523) Hier ist mein Programmieransatz:
Delphi-Quellcode:
procedure Form1.Zufallszahl_bilden();
var Zufallszahl: extended; Wert: string; begin Zufallszahl:= trunc(random(1) +0); randomize; Wert:= FormatFloat('0.00', Zufallszahl); showmessage(floattostr(Wert); end; Derzeit wird in meinem showmessage stets die Zahl 0,00 ausgegeben. Ich hoffe mir kann jemand helfen und mich auf meinen Fehler aufmerksam machen. Danke! |
Re: Zufallszahl mit Kommerstellen
Delphi-Quellcode:
var zahl: extended;
begin zahl := random end; |
Re: Zufallszahl mit Kommerstellen
Das Problem ist das Trunc
es schneidet den Nachkommateil ab deswegen kommt immer 0 raus, so dürfte es besser sein.
Delphi-Quellcode:
procedure Form1.Zufallszahl_bilden();
var Zufallszahl: extended; Wert: string; begin Zufallszahl:= (random(1)); randomize; Wert:= FormatFloat('0.00', Zufallszahl); showmessage(floattostr(Wert); end; |
Re: Zufallszahl mit Kommerstellen
Zitat:
p.s: habe vergessen, dass randomize noch aufgerufen werden muss, bevor man ne zahl generiert... :D p.p.s:KommA schreibt man nicht mir "er" :P |
Re: Zufallszahl mit Kommerstellen
Nein, wie schon geschrieben wurde: Ohne Parameter...
Random mit 1 als Parameter gibt einen Integerwert zwischen 0 und 1 ohne die 1 selbst zurück... Random ohne Parameter gibt einen Fließkommawert zwischen 0 und 1 zurück. |
Re: Zufallszahl mit Kommerstellen
Random(1) liefert doch schon einen Integer (bemnach ist Trunc da sinnlos),
allerdings im Bereich von 0 <= X < Range also bei 1 immer eine 0, da 0 <= X < 1
Delphi-Quellcode:
würde da eine 0 oder 1 liefern, da 0 <= X < 2
Range(2)
Range ohne Parameter liefert eine Gleitkommazahl im Bereich von 0 <= X < 1 also eine Zahl von 0 bis 0,999..... |
Re: Zufallszahl mit Kommerstellen
Danke für eure Zahlreichen Antworten!
vorher habe ich noch nicht gewusst, was Trunc bedeutet. ich hatte jedoch noch einen 2. Fehler. nämlich: Man muss zuerst randomize; schreiben bevor man die Zufallszahl bildet. Für die Richtigstellung, hier noch einmal die richtige Lösung
Delphi-Quellcode:
Danke! :-D
procedure Form1.Zufallszahl_bilden();
var Zufallszahl: extended; Wert: string; begin Zufallszahl:= (random(1)); randomize; Wert:= FormatFloat('0.00', Zufallszahl); showmessage(floattostr(Wert); end; |
Re: Zufallszahl mit Kommerstellen
Zitat:
![]() |
Re: Zufallszahl mit Kommerstellen
und das:
Delphi-Quellcode:
ist auch die falsche reinfolge...
Zufallszahl:= (random(1));
randomize; |
Re: Zufallszahl mit Kommerstellen
Darf ich nochmal vergleichen? Deine lösung:
Delphi-Quellcode:
meine Lösung:
procedure Form1.Zufallszahl_bilden();
var Zufallszahl: extended; Wert: string; begin Zufallszahl:= (random(1)); randomize; Wert:= FormatFloat('0.00', Zufallszahl); showmessage(floattostr(Wert); end;
Delphi-Quellcode:
welche macht sich besser?
procedure Form1.Zufallszahl_bilden();
var zufallszahl: extended; begin //Randomize bereits "aktiviert" zufallszahl := random; showmessage(floattostr(zahl); end; |
Re: Zufallszahl mit Kommerstellen
Vielen Dank!
ihr müsst wissen ich bin der totale Anfänger auf diesen Gebiet. Ich muss leider peichten: ich habe schon wieder ein problem: mit meinem SQLSTR ich möchte meiner Datenbank einen bereits vorhandenen Wert durch meinen Zufallswert ersetzen. Hier mein Ansatz.
Delphi-Quellcode:
procedure Form1.Zufallszahl_bilden();
var Zufallszahl: extended; Wert: string; begin randomize; Zufallszahl:= (random(1)); form1.adoquery1.close; form1.adoquery1.sql.clear; form1.adoquery1.sql.add('update Tabelle Set Wert = '+Zufallszahl; form1.adoquery1.open while not form1.adoquery1.eof do begin form1.adoquery1.next; end; form1.adoquery1.close; end; Fehlermeldung: Syntaxfehler in Update-anweisung. Bitte helft mir! |
Re: Zufallszahl mit Kommerstellen
Extended <-> String. Du musst also Zufallszahl erst per FloatToStr in einen String umwandeln (denn ein String wird intern ganz anders als eine Zahl gespeichert). ABER: random(1) liefert einen Integer- also Ganzzahlwert.
|
Re: Zufallszahl mit Kommerstellen
Zitat:
|
Re: Zufallszahl mit Kommerstellen
Sry, habs editiert nachdem du geschrieben hast.
edit: Es könnte hilfreich sein, wenn du sagst, was du genau erreichen möchtest. |
Re: Zufallszahl mit Kommerstellen
Bei meinem Programm handelt es sich um einen Vokabeltrainer!
Jedes Vokabel in meiner Datenbank hat einen anderen Wert. Dieser Wert soll sich nach jeder Vokabelüberprüfung in der Datenbank geändern und zwar zufällig. Die Zufallszahl habe ich bereits erstellen können. Jedoch hat mein "update" code irgendeinen Fehler den ich nicht finden kann. Siehe oben. DANKE |
Re: Zufallszahl mit Kommerstellen
Wenn du dir 100% sicher bist, dass deine Zufallszahl richtig generiert wird (ich verstehe immernoch nicht, warum du eine Dezimalzahl haben willst), ist dein Problem eigentlich geklärt. Aber ich schreibe es gerne auch noch einmal verständlicher auf:
Delphi-Quellcode:
Den Operator + gibt es ja in zwei Ausführungen, zum Addieren von Zahlen (also Integer, Single, ..., Extended) oder zum Verketten von Strings (Zeichenketten).
form1.adoquery1.sql.add('update Tabelle Set Wert = '+Zufallszahl;
Delphi hat eine starke Typisierung, im Gegensatz zu z. B. PHP. Und zwar möchstest du ja, wenn Zufallszahl = 0, dass dann update Tabelle Set Wert = 0 da steht. Dazu müsstest du aber Zufallszahl in einen String umwandeln (wie gesagt, Delphi nimmt dir das nicht ab). Das würde dann so aussehen:
Delphi-Quellcode:
Im Übrigen: Falls du dich in einer zu TForm1 gehörigen Methode befindest, reicht es, ADOQuery1 anstatt Form1.ADOQuery1 zu schreiben.
form1.adoquery1.sql.add('update Tabelle Set Wert = ' + FloatToStr(Zufallszahl);
|
Re: Zufallszahl mit Kommerstellen
HI,
zuerst mal die Syntax einer Update-Anweisung. Die sieht nämlich so aus:
SQL-Code:
Mit deiner Anweseiung, die ohne Bedingung daherkommt, wirst du in der Tabelle in der Spalte Wert bei jedem Datensatz den gleichen Wert haben. Jetzt ist immernoch nicht geklärt, ob es sich dabei um Ganzzahlen (0, 1, 2, 3, 4, ...) oder Gleitkommazahlen (0.1, 0.2, 0.3, 0.4, ...) handelt. Dementsprechen ist eine Typenumwandlungsfunktion zu wählen. Zahlen sind nun mal keine Zeichenketten. Sonst könntest du ja auch mit Buchstaben rechnen a la A + A = B ODER A + A = AA. Da weis Delphi dann nicht mehr, was jetzt gefragt ist.
UPDATE "Tabellen_Name"
SET "Spalte1" = [Wert] WHERE {Bedingung} Des Weiteren gibts noch einen Syntax-Fehler:
Delphi-Quellcode:
Nachdem du die Klammer geöffnet hast, solltest du diese vor dem Semikolon wieder schließen.
form1.adoquery1.sql.add('update Tabelle Set Wert = '+Zufallszahl;
Bernhard PS: SQL-Syntax von ![]() Falls es sich nun doch um Gelitkommazahlen handelt, könnte dich ![]() |
Re: Zufallszahl mit Kommerstellen
Vielen Dank für eure Antworten. Mein Problem ist trotzdem noch nicht gelöst.
hier mein derzeitiger Code:
Delphi-Quellcode:
procedure TPool.FormClose(sender: Tobject; var Action: TCloseAction);
begin Zufallszahl_bilden(); // in dieser procedure wird die Zufallszahl gebildet, var Zufallszahl: extended; form1.Adoquery1.close; form1.adoquery1.sql.add('update Tabelle set Wert = '+floattostr(Zufallszahl)); form1.adoquery1.exesql; while not form1.adoquery1.eof do begin form1.adoquery1.next; end; form1.adoquery1.close; end; ich hoffe mir kann jemand helfen |
Re: Zufallszahl mit Kommerstellen
Da beim Schließen des Fensters die Fehlermeldung kommt. Syntaxfehler. gehe ich davon aus, dass der Fehler bei SQL update liegt.
|
Re: Zufallszahl mit Kommerstellen
Und dies ist völlig überflüssig
Delphi-Quellcode:
Wenn du zum letzen willst einfach
while not form1.adoquery1.eof do begin
form1.adoquery1.next; end;
Delphi-Quellcode:
form1.adoquery1.Last;
|
Re: Zufallszahl mit Kommerstellen
Warum sollte ich zum letzen mögen.
ich möchte dass alle Zeilen geendert werden. deswegen next. |
Re: Zufallszahl mit Kommerstellen
Der Code bewirkt aber nur eine Schleife ohne was zu ändern. Zudem werden durch deinen Code ja schon alle geändert (allerdings alle auf den selben Wert), da du das Update nicht einschränkst
|
Re: Zufallszahl mit Kommerstellen
Und wie muss ich den Programmiercode ändern damit ich in jeder Zeile meiner Datenbank eine neue Zufallszahl habe? LG
|
Re: Zufallszahl mit Kommerstellen
Delphi-Quellcode:
procedure TPool.FormClose(sender: Tobject; var Action: TCloseAction);
begin form1.Adoquery1.close; form1.adoquery1.SQL.Text := 'select id from Tabelle;'; form1.adoquery2.SQL.Text := 'Update Tabelle set wert = :wert where id = :id'; form1.Adoquery1.Open; while not form1.adoquery1.eof do begin Zufallszahl_bilden(); // in dieser procedure wird die Zufallszahl gebildet, var Zufallszahl: extended; form1.Adoquery2.ParamByName('wert').Value := Zufallszahl; form1.Adoquery2.ParamByName('id').Value := form1.Adoquery1.FieldByName('id').Value; form1.adoquery2.ExecSQL; form1.adoquery1.next; end; form1.adoquery1.close; form2.adoquery1.close; end; |
Re: Zufallszahl mit Kommerstellen
Zufallszahl ist ein Extended, die SQL-Anweisung aber ein String, weshalb die Zuweisung fehlschlägt. Benutz die Funktion SysUtils.FloatToStr. Danach prüfst du im Debugger, was für eine Anweisung erstellt wird.
|
Re: Zufallszahl mit Kommerstellen
Schöne Lösung,
aber ich schätze du meinst mit id, den wert der derzeit in der Tabelle steht. Ich weiß aber nicht welcher Wert in der Tabelle steht. DAnke |
Re: Zufallszahl mit Kommerstellen
Nein, mit id meine ich den Primärschlüssel der Tabelle.
der Code geht durch die Tabelle und ändert immer den aktuellen Satz. Da ein PK eindeutig ist verwende ich ihn als Referenz im where des Update-Statements |
Re: Zufallszahl mit Kommerstellen
Was ist
SysUtils.FloatToStr. und Debugger? |
Re: Zufallszahl mit Kommerstellen
Hier wird dir keiner alles mundgerecht vorkauen. Benutz Google und die Dokumentation von Delphi.
![]() |
Re: Zufallszahl mit Kommerstellen
Es tut mir leid dass ich schon wieder so eine blöde frage stelle, aber für was braucht man
parambyname? ich konnte keine Verständliche Erklärung finden. danke |
Re: Zufallszahl mit Kommerstellen
Zitat:
ich möchte nicht nur einen bestimmten Datensatz ändern sonder alle. |
Re: Zufallszahl mit Kommerstellen
Aber jeden auf einen anderen Wert.
|
Re: Zufallszahl mit Kommerstellen
Zitat:
|
Re: Zufallszahl mit Kommerstellen
also nochmals um das bisherige zusammenzufassen:
Du hast ne Datenbank auf die du mit ADO zugreifst. In der gibts ne Tabelle mit nem Feld Wert vom Typ Gleitkommazahl. Nun möchest du in jedem Datensatz den Wert des Feldes Wert auf eine Zufallszahl ändern. Wenn es jetzt nicht unbedingt mit ADOQuery swein muss, würde ich in diesem Fall eine ADOTable vorschlagen. Da kannst du dann durch die einzelnen Zeilen gehen und den Wert entsprechend ändern.
Delphi-Quellcode:
Ich hoffe mal, dass das dir weiter hilft.
procedure Aendern;
begin while not ADOTable.Eof do begin ADOTable.Edit; // Versetzt die Tabelle in den Editiermodus ADOTable.Fields.FieldByName('Wert').AsFloat := Random; // zufallszahl in das Feld schreiben (ob das jetzt hier so richtig ist, weis ich net, da ich Delphi grad net offen hab) ADOTable.Post; // Daten in die Datenbaqnk schreiben ADOTable.Next; // nächster Datensatz end; end; Bernhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz