Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zufallszahl mit Kommerstellen (https://www.delphipraxis.net/130379-zufallszahl-mit-kommerstellen.html)

daNiii 7. Mär 2009 14:05


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!

Noedel 7. Mär 2009 14:07

Re: Zufallszahl mit Kommerstellen
 
Delphi-Quellcode:
var zahl: extended;
begin
zahl := random
end;

Corpsman 7. Mär 2009 14:07

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;

Noedel 7. Mär 2009 14:12

Re: Zufallszahl mit Kommerstellen
 
Zitat:

Zitat von Corpsman
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;

meinst du nicht, dass der Vorschlag s.o. einfacher ist?

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

jaenicke 7. Mär 2009 14:13

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.

himitsu 7. Mär 2009 14:20

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:
Range(2)
würde da eine 0 oder 1 liefern, da 0 <= X < 2


Range ohne Parameter liefert eine Gleitkommazahl im Bereich von
0 <= X < 1

also eine Zahl von 0 bis 0,999.....

daNiii 7. Mär 2009 14:21

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:
procedure Form1.Zufallszahl_bilden();
var
Zufallszahl: extended;
Wert: string;
begin

Zufallszahl:= (random(1));
randomize;
Wert:= FormatFloat('0.00', Zufallszahl);
showmessage(floattostr(Wert);
end;
Danke! :-D

himitsu 7. Mär 2009 14:23

Re: Zufallszahl mit Kommerstellen
 
Zitat:

Zitat von daNiii
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

ließ nochmal in deiner OH unter Delphi-Referenz durchsuchenRandomize nach, da steht dann auch, daß man dieses nicht immer aufrufen soll, sondern nur einmal beim Programmstart.

Teekeks 7. Mär 2009 14:31

Re: Zufallszahl mit Kommerstellen
 
und das:
Delphi-Quellcode:
Zufallszahl:= (random(1));
randomize;
ist auch die falsche reinfolge...

Noedel 7. Mär 2009 14:33

Re: Zufallszahl mit Kommerstellen
 
Darf ich nochmal vergleichen? Deine lösung:

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;
meine Lösung:
Delphi-Quellcode:
procedure Form1.Zufallszahl_bilden();
var
 zufallszahl: extended;
begin
  //Randomize bereits "aktiviert"
  zufallszahl := random;
  showmessage(floattostr(zahl);
end;
welche macht sich besser?

daNiii 7. Mär 2009 14:44

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!

Jakob Ullmann 7. Mär 2009 15:03

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.

daNiii 7. Mär 2009 15:04

Re: Zufallszahl mit Kommerstellen
 
Zitat:

Extended <-> String.
was meinst du?

Jakob Ullmann 7. Mär 2009 15:05

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.

daNiii 7. Mär 2009 15:13

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

Jakob Ullmann 7. Mär 2009 15:47

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:
form1.adoquery1.sql.add('update Tabelle Set Wert = '+Zufallszahl;
Den Operator + gibt es ja in zwei Ausführungen, zum Addieren von Zahlen (also Integer, Single, ..., Extended) oder zum Verketten von Strings (Zeichenketten).

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:
form1.adoquery1.sql.add('update Tabelle Set Wert = ' + FloatToStr(Zufallszahl);
Im Übrigen: Falls du dich in einer zu TForm1 gehörigen Methode befindest, reicht es, ADOQuery1 anstatt Form1.ADOQuery1 zu schreiben.

rollstuhlfahrer 8. Mär 2009 07:50

Re: Zufallszahl mit Kommerstellen
 
HI,

zuerst mal die Syntax einer Update-Anweisung. Die sieht nämlich so aus:
SQL-Code:
UPDATE "Tabellen_Name"
SET "Spalte1" = [Wert]
WHERE {Bedingung}
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.
Des Weiteren gibts noch einen Syntax-Fehler:
Delphi-Quellcode:
form1.adoquery1.sql.add('update Tabelle Set Wert = '+Zufallszahl;
Nachdem du die Klammer geöffnet hast, solltest du diese vor dem Semikolon wieder schließen.

Bernhard

PS: SQL-Syntax von hier
Falls es sich nun doch um Gelitkommazahlen handelt, könnte dich das interessieren.

daNiii 8. Mär 2009 09:58

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

daNiii 8. Mär 2009 10:00

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.

mkinzler 8. Mär 2009 10:07

Re: Zufallszahl mit Kommerstellen
 
Und dies ist völlig überflüssig
Delphi-Quellcode:
while not form1.adoquery1.eof do begin
  form1.adoquery1.next;
end;
Wenn du zum letzen willst einfach
Delphi-Quellcode:
form1.adoquery1.Last;

daNiii 8. Mär 2009 11:17

Re: Zufallszahl mit Kommerstellen
 
Warum sollte ich zum letzen mögen.
ich möchte dass alle Zeilen geendert werden.
deswegen next.

mkinzler 8. Mär 2009 11:27

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

daNiii 8. Mär 2009 11:29

Re: Zufallszahl mit Kommerstellen
 
Und wie muss ich den Programmiercode ändern damit ich in jeder Zeile meiner Datenbank eine neue Zufallszahl habe? LG

mkinzler 8. Mär 2009 11:34

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;

BackOrifice 8. Mär 2009 11:43

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.

daNiii 8. Mär 2009 11:43

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

mkinzler 8. Mär 2009 11:46

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

daNiii 8. Mär 2009 11:47

Re: Zufallszahl mit Kommerstellen
 
Was ist
SysUtils.FloatToStr.
und
Debugger?

BackOrifice 8. Mär 2009 11:51

Re: Zufallszahl mit Kommerstellen
 
Hier wird dir keiner alles mundgerecht vorkauen. Benutz Google und die Dokumentation von Delphi.

http://de.wikipedia.org/wiki/Debugger

daNiii 8. Mär 2009 13:09

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

daNiii 8. Mär 2009 14:01

Re: Zufallszahl mit Kommerstellen
 
Zitat:

form1.adoquery2.SQL.Text := 'Update Tabelle set wert = :wert where id = :id';
und was soll ich hier bitte als Id eingeben?
ich möchte nicht nur einen bestimmten Datensatz ändern sonder alle.

mkinzler 8. Mär 2009 14:06

Re: Zufallszahl mit Kommerstellen
 
Aber jeden auf einen anderen Wert.

blawen 8. Mär 2009 14:44

Re: Zufallszahl mit Kommerstellen
 
Zitat:

Zitat von daNiii
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

Vielleicht, um einem Feld einen Wert zu übergeben bzw. ihn auszulesen?

rollstuhlfahrer 9. Mär 2009 20:17

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:
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;
Ich hoffe mal, dass das dir weiter hilft.

Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz