AGB  ·  Datenschutz  ·  Impressum  







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

Zufall Zahlen ?? (Auslosung)

Ein Thema von Darty · begonnen am 25. Jun 2002 · letzter Beitrag vom 25. Jun 2002
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Darty
Darty

Registriert seit: 8. Jun 2002
Ort: Kronau
731 Beiträge
 
#1

Zufall Zahlen ?? (Auslosung)

  Alt 25. Jun 2002, 13:36
Hallo Leutz,

hat jemand einen passenden neutralen Code für einen Zufall-Generator ? Es sollte zum Beispiel der bereich 1 - 32 (Dass wäre die ID-Nummern) aussuchen und es dann neu belegen ... Zum Beispiel ID22 kommt dann in Nr. 3 rein u.s.w. Dabei darf jede ID nur einmal vorkommen.
Für besseres Verständnis, diese code sollte für die "Auslosung und Verteilung" der Spieler auf Turnier-Plänen verwendet werden.

Ich kannte noch von damals im basic die Befehle RND, das problem damals war wenn ich mich noch richtig erinnere, dass beim Programm Start immer die gleichen Zufall-Zahlen generiert wurden. Und dass will ich natürlich verhindern.

Ich bedanke mich schon mal im Vorraus für euer Bemühungen ...
Matthias Knebel
Mfg M. Knebel [-Darty-]
- Gehörlose Delphianer gibt es selten -
www.team-knebel.de
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 25. Jun 2002, 13:40
Der entsprechende zun RND Befehl in Delphi ist

ID := Random(maxwert); //0..Maxwert-1

Um immer andere Zahlen zu erzeugen, musst Du einmalig vor dem ersten Aufruf von Random den Generator mit
Code:
Randomize;
initialisieren.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Darty
Darty

Registriert seit: 8. Jun 2002
Ort: Kronau
731 Beiträge
 
#3
  Alt 25. Jun 2002, 13:47
Huii, dass hilft mir schon etwas weiter

Nur ich überlege wie ich es anstellen könnte so dass keine doppelte Zahlen auftauchen.
Ansonstens müsste ich nach dem Random immer überprüfen ist zum Beispiel die Zahl 30 schon ausgelost, dann gleich wieder von vorne anfangen.. Will irgendwie erreichen, dass zum Beispiel wenn die Zahl 5, 10 und 30 schon gesetzt ist, dass dann nur noch 1-4+6-9+11-29 in Random einbezogen wird. Sonst könnte eventuell zu lange durchziehen wenn nur noch die Zahl 3 fehlen würde und er aber so lange Random mit 32 Zahlen macht bis er endlich mal auf 3 kommt ?? Oder ist mein Gedanke falsch ?
Matthias Knebel
Mfg M. Knebel [-Darty-]
- Gehörlose Delphianer gibt es selten -
www.team-knebel.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 25. Jun 2002, 13:50
Schreibs in ein Array und nach jeder Ziehung gehst du das Array mit einer Schleif edurch und überprüfst ob die Zahl im Array schon drin steht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 25. Jun 2002, 13:52
Es gibt mehrere Möglichkeiten

1. Du erstellst eine zweite Liste, in der die genutzten Zahlen markiert werden. Wenn eine bereits gezogene Zahl kommt, dann erhöhst Du den Wert, bis eine ungenutzte Zahl erreicht ist.

2. Du erstellst eine zweite Liste, in der die genutzten Zahlen markiert werden. Wenn eine bereits gezogene Zahl kommt, ziehst Du nochmal, bis eine ungenutzte Zahl drankommt. Sollte auch nicht merklich länger dauern - lt. Stochastik, aber wie der Zufall so will.

3. Du erstellst eine zweite Liste, in der die genutzten Zahlen markiert werden. Mit jeder gezogenen Zahl wird der Maximalwert um eins verringert. Für eine gezogene Zahl werden die nicht-genutzten abgezählt, und die entsprechende genutzt.

... und, und, und. Die obigen drei dürften aber die übliichsten sein.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Darty
Darty

Registriert seit: 8. Jun 2002
Ort: Kronau
731 Beiträge
 
#6
  Alt 25. Jun 2002, 13:53
@luckie: hmmm kannst du es wenigstens ein wenig code-Ansatz bringen ? Verstehe nicht ganz ?
Matthias Knebel
Mfg M. Knebel [-Darty-]
- Gehörlose Delphianer gibt es selten -
www.team-knebel.de
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 25. Jun 2002, 14:05
Für Lösung zwei (ungetestet)

Im Array Zahlen findest Du am Ende alle Zahlen in der gezogenen Reihenfolge.

Code:
const
  Max = 32;
var
  Zahlen: array[0..Max-1] of Integer;

procedure Ziehung;
var
  I, J, Zahl: Integer;
  Gezogen: array[0..Max-1] of Boolean;
begin
  FillChar(Gezogen, SizeOf(Gezogen), #0);
  Randomize;
  for I := 0 to Max-1 do
  begin
    Zahl := Random(Max);
    while Gezogen[Zahl] do
    begin
      Inc(Zahl);
      if Zahl > Max then
        Zahl := 0;
    end;
    Gezogen[Zahl] := True;
    Zahlen[I] := Zahl;
  end;
end;
So, oder so ähnlich...
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#8
  Alt 25. Jun 2002, 14:29
Hi,

Schau dir mal "Zufallszahlen ohne Duplikate generieren" von Julian M Bucknall
an:

http://www.swissdelphicenter.ch/de/showcode.php?id=1006
tom
Thomas
  Mit Zitat antworten Zitat
Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#9
  Alt 25. Jun 2002, 14:31
Hiho!

Bei so einem kleinen Wertebereich ist es natürlich egal, sollten aber irgendwann einmal größere Bereiche auftreten wäre es wohl effektiver, eine Liste zu benutzen:

Man füllt die Liste mit den zu vergebenden Werten.
Anschliessend greift man sich ein zufälliges Element aus der Liste ("Random(List.Count)") und löscht dieses dann aus der Liste raus.

So muss man nicht immer wieder sämtliche Elemente durchgehen, um zu schauen, ob dies schon vergeben ist.

Cu,
Udontknow
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#10
  Alt 25. Jun 2002, 14:33
Zitat von Udontknow:
So muss man nicht immer wieder sämtliche Elemente durchgehen, um zu schauen, ob dies schon vergeben ist.
Spannende Frage ist, was schneller ist, andauernd Speicher stückchenweise freizugeben (Elemente aus der Liste enfernen) oder Liste durchlaufen. Ich denke mal, dass das ganze auf den Bereich der auszuwählenden Zahlen drauf ankommt.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:54 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