AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zufallszahl ziehen ohne wiederholung

Offene Frage von "walli18"
Ein Thema von walli18 · begonnen am 6. Feb 2009 · letzter Beitrag vom 17. Feb 2009
Antwort Antwort
Seite 2 von 7     12 34     Letzte »    
walli18

Registriert seit: 29. Jan 2009
21 Beiträge
 
#11

Re: Zufallszahl ziehen ohne wiederholung

  Alt 6. Feb 2009, 23:09
Danke Melfin für deine Antwort, aber mit diesem Array zeugs kenne ich mich gar net aus! Ich weiß gar nicht, wo ich das hinschreiben soll!
Könntest du das nicht mal zusammenhängend und dan nem Beispiel posten, wo das alles hin soll mit erklärung usw.?
Wäre echt klasse, wie gesagt, ich hab da nicht so sehr viel Ahnung!
Dankeschön!!!! 8)
  Mit Zitat antworten Zitat
walli18

Registriert seit: 29. Jan 2009
21 Beiträge
 
#12

Re: Zufallszahl ziehen ohne wiederholung

  Alt 6. Feb 2009, 23:16
Ich habs mal eingegeben! Aber ich bekomme noch in der Zeile ne Fehlermeldung:
for i := 0 to Length(MyArray) - 1 do [b]Da schreibt er: FOR Schleifenvariable muss eine einfache lokale Variable sein!
Was habe ich falsch gemacht??

[edit=mkinzler]Tag korrrigiert Mfg, mkinzler[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#13

Re: Zufallszahl ziehen ohne wiederholung

  Alt 6. Feb 2009, 23:20
bitte das Randomize nur einmal im Programm aufrufen (z.b. im FormCreate).der generator muss nur einmal initialisiert werden und bei mehrfachem Aufrufen kann es sein, dass die Zufallszahlen nicht so zufällig sind wie gewünscht.

betreffs lokale variable:
das i muss in der prozedur/function/methode definiert werden wo es verwendet wird.

Delphi-Quellcode:
procedure blah();
var i:integer;
begin
  ...
end;
@walli
bitte nutze die delphi-tags und mach eine Vorschau um sicherzustellen, dass auch das [/delphi] vorhanden ist

Gruß Frank
  Mit Zitat antworten Zitat
walli18

Registriert seit: 29. Jan 2009
21 Beiträge
 
#14

Re: Zufallszahl ziehen ohne wiederholung

  Alt 6. Feb 2009, 23:24
bei form activate habe ich randomize reingenommen! Ansonsten nicht! Aber bei 15 von 40 Fragen, ist die Wahrscheinlichkeit schon hoch, dass die Fragen doppelt kommen und das soll eben nicht passieren!
i und rnd habe ich schon mit als Integer deklariert!
Ich hab nur den Fehler mit der FOR schleifenvariablen!
  Mit Zitat antworten Zitat
Benutzerbild von Marc.
Marc.

Registriert seit: 14. Mär 2008
Ort: Aachen
22 Beiträge
 
Delphi 2009 Professional
 
#15

Re: Zufallszahl ziehen ohne wiederholung

  Alt 6. Feb 2009, 23:25
Alternative: Man nehme ein Array mit Zahlen von 1 bis 40 und mischt diese - fertig sind die Zufallszahlen, die garantiert auch nur einmal vorkommen.
Schnell mal runtergetippt, wobei es jetzt kein Musterbeispiel darstellen soll:
Delphi-Quellcode:
 SetLength(ZufallsZahlen, 40);
  for i := Low(ZufallsZahlen) to High(ZufallsZahlen) do
    Zufallszahlen[i] := i+1;

  for i := Low(ZufallsZahlen) to High(ZufallsZahlen) do
  begin
    rnd := random(40);
    t := Zufallszahlen[rnd];
    Zufallszahlen[rnd] := Zufallszahlen[i];
    Zufallszahlen[i] := t;
  end;
Randomize besser ins FormCreate, wobei es auch fast keinen Unterschied machen sollte.

cu
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#16

Re: Zufallszahl ziehen ohne wiederholung

  Alt 6. Feb 2009, 23:36
Hi!

Ich muss leider noch 2 Bitten äußern - wobei, es ist fast nur eine:
Du kannst auch in deinem obigen Beitrag die Delphi-Tags noch ergänzen. Dazu kannst du oben rechts am Beitrag auf Edit drücken und den Text dann bearbeiten.
Zum anderen würde ich dich bitten, keine Doppel-/Dreifachposts zu machen. Wenn dir später noch eine Ergänzung einfällt, dann kannst du auch wiederum deinen vorhandenen Beitrag mit der Edit-Funktion bearbeiten.


Ciao, Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
walli18

Registriert seit: 29. Jan 2009
21 Beiträge
 
#17

Re: Zufallszahl ziehen ohne wiederholung

  Alt 7. Feb 2009, 00:16
Ich hab jetzt nochmal in ruhe darüber nachgedacht und mein Problem Theoretisch gelöst! Jetzt müsste ich nur noch genau wissen, wie ich das umsetzte!

1. Beim klicken auf ein image in meinem Programm(zum spiel starten) wird eine "Liste" erstellt mit zahlen von 1 bis 40
2. Beim klicken auf button1 wird daraus eine zufallszahl gezogen, die gezogene zufallszahl wird von der "Liste" entfernt
3. Auf diesen Button1 wird jetzt 15 mal geklickt für 15 Fragen, d.h. nach jeder gezogenen Frage z.B. Frage 2 wird eine Frage ausgewählt von 1-40 außer 2!
Die letztendliche zufallszahl soll als Integerwert Schwierigkeitsgrad heißen.(Das ist zwar eine blöde Bezeichnung, aber ich habe bis jetzt die Lösungen und Fragen damit schon bezeichnet, deswegen wäre das nicht schlecht, die Zufallszahl gleich so auszugeben)

Das wäre die Theoretische Lösung, ich hofe, dass mir das jemand in nen Quelltext packen kann!
Ich freue mich schon auf die Antworten!!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#18

Re: Zufallszahl ziehen ohne wiederholung

  Alt 7. Feb 2009, 00:28
Schau dir doch einfach mal oben den entsprechenden Quelltext an, den hat Meflin nämlich bereits geschrieben...
http://www.delphipraxis.net/internal...=998513#998513

Und Marc.s Lösungsvorschlag ist ja auch schon fertig gewesen (bis auf den Zugriff auf die ersten zahlen des Arrays, aber das ist ja wohl kein Problem).
http://www.delphipraxis.net/internal...=998529#998529
Das funktioniert anders, aber auch sehr gut.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#19

Re: Zufallszahl ziehen ohne wiederholung

  Alt 7. Feb 2009, 00:39
Zitat von walli18:
Die letztendliche zufallszahl soll als Integerwert Schwierigkeitsgrad heißen.(Das ist zwar eine blöde Bezeichnung, aber ich habe bis jetzt die Lösungen und Fragen damit schon bezeichnet, deswegen wäre das nicht schlecht, die Zufallszahl gleich so auszugeben)
halte ich für ungünstig, den zufallszahlen einer liste mit verschiedenen "Funktionen" zu belegen.oder hab ich dich falsch verstanden....die zufallszahl sollte schon unabhängig der liste gezogen werden.

Zitat von walli18:
Das wäre die Theoretische Lösung, ich hofe, dass mir das jemand in nen Quelltext packen kann!
Ich freue mich schon auf die Antworten!!
der Großteil wurde doch schon gelöst...bisschen Eigeninitiative wäre schon wünschenswert.

hatte bisschen Langeweile und hab das ganze mal zu Übungszwecken (und zur Verwirrung) absichtlich bisschen komplexer gelöst *g*:

Delphi-Quellcode:
var
  numbers:array[0..1] of cardinal;
...
function allBitsSet(maxvalue:integer):boolean;
var max1,max2:boolean;
begin
  if maxvalue>32 then
  begin
    max1:=(numbers[0] xor ($FFFFFFFF))=0;
    max2:=(numbers[1] xor ((1 shl (maxvalue-32))-1)=0)
  end else
  begin
    max1:=(numbers[0] xor ((1 shl maxvalue)-1)=0);
    max2:=true;
  end;
  result:=max1 and max2;
end;

function GetRndNumber(maxvalue:byte):byte;
var bitpos,idx:byte;
    mynumber:byte;
begin
  result:=0;
  if maxvalue>64 then exit;
  //abruchbedingung, wenn alle bits gesetzt sind

  if allbitsset(maxvalue) then
  begin
    showmessage('maximale anzahl der Zufallszahlen erreicht');
    exit;
  end;
  while result=0 do
  begin
    mynumber:=random(maxvalue)+1;
    idx:=(mynumber-1) div 32;
    bitpos:=mynumber-(idx*32);
    if (numbers[idx] and (1 shl (bitpos-1)))=0 then
    begin
      numbers[idx]:=(numbers[idx] or (1 shl (bitpos-1)));
      result:=mynumber;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var n:byte;
begin
  n:=GetRndNumber(40);
  label1.caption:=inttobin(numbers[0]);
  label2.caption:=inttobin(numbers[1]);
  ShowMessage(IntToStr(n));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
  numbers[0]:=0;
  numbers[1]:=0;
end;
vielleicht ist ja die eine oder andere funktion hilfreich.
hab grade mit TLargeIntger rumgespielt und da wollte ich bisschen rumspielen

mal im Ernst, die array-Variante von Marc ist schon die effektivste

Gruß Frank
  Mit Zitat antworten Zitat
blink182

Registriert seit: 19. Jun 2007
126 Beiträge
 
Delphi 5 Standard
 
#20

Re: Zufallszahl ziehen ohne wiederholung

  Alt 7. Feb 2009, 00:59
hab auch mal eben noch was getestet, ist wahrscheinlich nicht so gut wie der oben gepostete code, da es nach 40 klicks eine endlosschleife gibt, aber das kannst du ja noch beheben

Delphi-Quellcode:
  zufall: array of integer;
  fragen: array of string;
  frage:string;


procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
setlength(zufall,40);
setlength(fragen,40);
for i:=0 to length(zufall) do
zufall[i]:=i+1;
end;

procedure TForm1.Button2Click(Sender: TObject);
var a:integer;
begin
a:=random(39);
if zufall[a]<>0 then
begin
Showmessage(inttostr(zufall[a]));
zufall[a]:=0;
frage:=fragen[a];
end
else
begin
repeat
a:=random(39);
until zufall[a]<>0;
Showmessage(inttostr(zufall[a]));
zufall[a]:=0;
frage:=fragen[a];
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
end;
gn8 blink182
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 7     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 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