Startseite ¦  was ist neu ¦  programmier tips ¦  indy artikel ¦  intraweb artikel ¦  informationen ¦  links ¦  interviews ¦  sonstiges
kylix ¦  tutorials ¦  online shop ¦  fotos ¦  Add&Win Gewinnspiel


Willkommen Gast. Bitte einloggen oder registrieren.
21.05.2012, 12:49:44
Übersicht Hilfe Suche Einloggen Registrieren

+  SwissDelphiCenter Forum
|-+  German Forums
| |-+  Einsteiger Forum
| | |-+  öhm zufallsgenerator?
« vorheriges nächstes »
Seiten: [1] 2 Drucken
Autor Thema: öhm zufallsgenerator?  (Gelesen 5986 mal)
SeeAAL
Newbie
*
Offline Offline

Beiträge: 7



« am: 27.03.2002, 20:04:26 »

also ich weiss wie ich ne zufallszahl generiere, das soll aber net das problem sein .
also  ich hab nen array von 1..52 und ich hab 4 x 13 werte ( kartenspiel 2 - Ass)

ich brauch nun nen zufallsgenerator der nun zufällig die 4 x 13 werte dem array zuweisst . dabei darf z.b. die 13 ( also das ass)nur 4 mal drin vorkommen des halb 4 x 13 :-)

hab selber schon lange dran rumgetüfftelt :-)
Gespeichert

ja ja ich gebs zu ich habe keine ahnung von delphi ;-)
Loïs Bégué
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1718



WWW
« Antworten #1 am: 27.03.2002, 20:22:53 »

So ung. (sehr einfach gehalten):

Code:
Var

   aCards: Array[1..52] of Integer;

   aRandom: Array[1..52] of Boolean;

   aRandomCount: Integer;

   z:integer;

Begin

   aRandomCount:=0;

   FillChar(aRandom,SizeOf(aRandom),0);

   FillChar(aCards,SizeOf(aCards),0);

   while aRandomCount<52 do Begin

      z:=random(53); //hier prüfen, meine IDE ist ausgescahltet :o)

      If not aRandom[z] then begin

         aRandom[z]:=True;

         Inc(aRandomCount);

         aCards[aRandomCount]:=z;

         End;

      end;

End;
Gespeichert

Prof.Y
Arpoon
marian19
Full Member
***
Offline Offline

Beiträge: 248



« Antworten #2 am: 27.03.2002, 22:17:48 »

also, bei karten spiele bist du bei mir genau richtig. ich habe vor 2min mein 4tes kartenspiel fertig gemacht.
der code von Loïs Bégué is sehr umstandlich und falsch.
z := random(53) = 0..52 da sein array aber von 1..52 geht passieren komische sachen....
ich hab es so gemacht.

Code:

procedure TFormPatience.schudden;

var

i,hulp, randomzahl : integer;



begin

  for i:= 1 to 52 do

  stock[i] :=i;



  Randomize;

  for i:= 1 to 52 do

  begin

    randomzahl := succ(random(52));

    hulp := stock[i];

    stock[i] := stock[randomzahl];

    stock[randomzahl] := hulp;

  end;



end; {van schudden}





]
Gespeichert

Veni Vidi Vici
marian19
Full Member
***
Offline Offline

Beiträge: 248



« Antworten #3 am: 27.03.2002, 22:27:55 »

ich hab auch noch ne frage uber mein kartenspiel...
ich habe 17 images. bei image17.click passiert das:
begin
bla
bla
bla
image17.visible := false
end;

das bla bla is bei jedes images das selbe, nur sol unter image16..1.click stehen image16..1.visible := false satt image17...
wie kan ich das machen ohne 16 mahl den code zu copieren?
Gespeichert

Veni Vidi Vici
SeeAAL
Newbie
*
Offline Offline

Beiträge: 7



« Antworten #4 am: 27.03.2002, 22:50:51 »

mh ja leider funktionierte keiner der lösungsvorschläge wie ich es gerne hätte :-)
der erste brachte mir eine sehr komische fehler meldung und der 2. war zwar schon nahe dran aber so nah war ich auch schon :-)
mh erkläre ich mal genauer wie ich es meine
das spielfeld sieht ungefähr so aus

                1                  21             29
              2  3             19 20         27 28
            4  5  6        16 17 18     24 25 26
          7  8  9 10   11   12   13  14 15 22 23
       
der rest der karten liegen in einer reihe verdeckt  und eine karte liegt offen daneben.  Die zahlen wie oben haben in der reihen folge nichts zu bedeuten bin halt kein begnadeter ascii künstler *g*
so nun will ich halt sagen das z.b. das pik ass zufällig  die karte 6 ist
und das muss ja irgentwie mit allen 52 karten gehen :-) das prob was ich bis jetzte hatte war halt immer das der nie die richtige anzahl z.b. von den assen hatte also mal 3 oder mal 5 sogar aber ich darf ja nur 4 haben :-)

sou ich hoffe das war verständlicher :-)
 
und trotzdem danke für eure bemühungen :-)
Gespeichert

ja ja ich gebs zu ich habe keine ahnung von delphi ;-)
SeeAAL
Newbie
*
Offline Offline

Beiträge: 7



« Antworten #5 am: 27.03.2002, 22:55:30 »

huch die zahlen sind nen bisschen verrutscht

es sollen halt 3 dreiecke sein naja so ungefähr halt :-)
Gespeichert

ja ja ich gebs zu ich habe keine ahnung von delphi ;-)
Pasci
Hero Member
*****
Offline Offline

Beiträge: 575


61040401
WWW
« Antworten #6 am: 27.03.2002, 22:58:03 »

@ marian

hi..

ich hatte das selbe problem.. aber mit webbrowsern...
hab hier im forum folgenden tipp bekommen...
schau mal
[a href="http://www.swissdelphicenter.ch/de/forum/viewtopic.php?t=341" target="_blank"]http://www.swissdelphicenter.ch/de/forum/v...topic.php?t=341[/a]

Mfg Screaminator
Gespeichert

*****************
    Open your mind,
    use open source,
  stop using windows!!
*****************
marian19
Full Member
***
Offline Offline

Beiträge: 248



« Antworten #7 am: 27.03.2002, 23:58:34 »

maybe kanste hier was mit anfangen:


Code:
procedure TFormPatience.Schudden;

var

  i, j, x, helpg : Integer;

  OK: Boolean;

begin

   randomize;

  for i := 1 to 52 do

  begin

    repeat

      OK := True;

      x := succ(Random(52));

      for j := 0 to pred(i) do

        if stock[j] = x then

          OK := False;

    until OK;

    stock[i] := x;

  end; {van for}
Gespeichert

Veni Vidi Vici
Loïs Bégué
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1718



WWW
« Antworten #8 am: 28.03.2002, 00:41:17 »

Hi,
Mein Code hatte einen einzigen Fehler. Ok. Ich hatte gewarnt...Kein IDE.
Du brauchst nur die Zeile
Code:
z:=random(53);

durch
Code:
z:=random(52) + 1;

zu ersetzen, so daß z zwischen 1 und 52 liegt.

Das Gesamtergebnis ist aber richtig !!!
Und zwar deshalb:
- Ich halte in aRandom fest, welche der Karten schon gezogen wurde.
- Ich wiederhole die Ziehung (random) bis ich eine Karte bekomme, die noch nicht gezogen wurde.
- Ich wiederhole das Ganze solange ich nicht alle 52 Karten (aRandomCount<52) gezogen habe.
- Wenn eine neue Karte gezogen wurde, dann merke ich sie an der nächste Position in aCard. D.h. also am Ende daß aCard alle 52 unterschiedlichen Karten in der Reihenfolge wie sie gezogen wurden enthält.

Fazit:
Eine "merkwürdige" aber funktionierende Lösung ist besser als eine nicht funktionierende Lösung.
Meine Lösung funktionniert.

Gruß,
Gespeichert

Prof.Y
Arpoon
Loïs Bégué
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1718



WWW
« Antworten #9 am: 28.03.2002, 00:52:21 »

@marian19:
Deine Lösung: Eine Prozedure für alle Click-Ereignisse benutzen.
Im Objektinspektor erstellst Du den folgenden Code für die allererste Komponente (z.B. Image1) und dann wählst Du alle anderen und weist allen die selbe Prozedure zu.
Code:
Procedure TForm1.Image1Click(Sender: TObjekt);

Begin

   blablabla...

   blablabla...

   blablabla...

   // Sicherheitstest

   If Sender is TImage then

      (Sender as TImage).visible:=False;

End;

Durch Benutzung von "Sender" wird nun sichergestellt, daß nur die Kompo behandelt wird, die tatsächlich angeklickt wurde...

SatzHol :o)

Gruß,
Gespeichert

Prof.Y
Arpoon
marian19
Full Member
***
Offline Offline

Beiträge: 248



« Antworten #10 am: 28.03.2002, 01:00:25 »

du hast noch ein "fehler" du benutzt kein randomize, was bedeute das du kein richtiges random hast. jedes mal werden die zahlen auf der selben art "gemischt"

Zitat
Eine \"merkwürdige\" aber funktionierende Lösung ist besser als meine nicht funktionierende Lösung.  
Meine Lösung funktionniert
.

so wie du das gepostest hattest fun. es nicht...
und ich habe nicht merkwurdig gesagt sondern umstandlich, und das stimmt 100%...
so wie du dein array fullst koente (theoretisch) das folgende passieren:
du nimmst eine random zahl, wenn du die schon hast nimmst du eine neue random zahl. solange bis du eine zahl hast die noch nicht genommen ist. (nochmals theoretisch) koente es passieren das du eine unendliche loop bekommst weil random immer eine zahl nimmt die du schon hast.
 die wahrscheinlichkeit das jedesmal ne andere zahl kommt is keine anung wie klein.
mit meiner losung macht man nix zuviel und is theoretisch ne unendliche loop ausgeschlossen
Gespeichert

Veni Vidi Vici
Loïs Bégué
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1718



WWW
« Antworten #11 am: 28.03.2002, 02:04:12 »

...für Dich.
Drei Dinge.

Erstens:

Zitat
du hast noch ein \"fehler\" du benutzt kein randomize, was bedeute das du kein richtiges random hast
Leider leider schreibst Du schneller kritik als Du prüfen kannst, ob sie berechtigt ist.
Es ist kein Fehler. Eine klassische, manchmal sogar wünschenswerte, Eigenart des Computers, nicht von Random.
Randomize tut nur die Sache "etwas" (nun leider nicht ganz) verbessern.
ABER: es war nicht die Aufgabe, GANZ zufällig zu ziehen sondern ÜBERHAUPT ALLE KARTE zu ziehen.
Falls es Dir nicht bekannt ist: es gibt noch KEIN Algorythmus, das in einem Computer läuft und RICHTIGE Zufallszahlen produziert. WELTWEIT. Frage mal Henri Pointcarré (französischer Mathématiker und UBoot der Klasse 1500 T also Redoutable ) der sich mit dem Thema "Entstehung des Chaos" bzw. "Unberechenbarkeit von deterministischen Systeme" beschäftigte...

Zweitens:So wie ich mein Array fülle gibt es diese Chance im Computer NICHT.
Rein mathematisch würde das bedeuten eine unendliche Ziehung aus immer dieselbe Zahl aus 52 möglichen. Die Wahrscheinlicjkeit, daß Du es schaffst, einen Hanoi-Turm aus 64 Elemente fertig zu bewegen ist größer.

Drittens:
Lese und lerne!!! Ich habe geschrieben: "(sehr einfach gehalten): " also ohne Anspruch auf einen Mode-Preis. Aber es funktionniert.
Dein erster Algo "Schudden" ist KEIN Ziehen sondern ein Mischen, wobei nicht sichergestellt ist, daß eine Karte überhaupt bewegt wird und daß eine Karte nicht 30 mal bewegt wird.
Dein zweiter Algo...hat soviele Probleme....

ABER: Denke nach und fang nicht einen Streit mit mir an. Auf diesem Gebiet würde ich Dir nicht gewinnen lassen, ich bin Widder und habe wahrscheinlich noch genug Erfahrung.... :o))

Gruß...trotzdem :o)
Gespeichert

Prof.Y
Arpoon
SeeAAL
Newbie
*
Offline Offline

Beiträge: 7



« Antworten #12 am: 28.03.2002, 08:45:52 »

hey nicht streiten *g*

also ich hab mir mal meinen lösungsvorschlag  :-)

Code:
procedure TForm1.StartClick(Sender: TObject);

var

a,q,w,e,r : integer;

dummy : integer;



begin

 r := 1;

 for a := 1 to 13 do

 begin

 for q := 1 to 4 do

  begin

    w := random(52) + 1;

   if kart[w] = false then

    begin

      karte[w] := r;

      kart[w] := true;

     end

    else

     begin



{ hier muss noch mal was rein was mir noch mal nen random gibt aber gleichzeitig wieder überprüft ob die zahl nicht schon vergeben ist }

    

     end;

   end;

  inc(r);

  end;

end;


ja ja ich weiss ich hab komische vari namen *g* aber das tut nix zur sache

so wenn alles richtig funktioniert dann sollte es hinterher 4 mal die 1 auf verschiedenen karten geben 4 mal die 2 auf verschiedenen karten usw usw  das ganze dann aber ohne das eine karte doppelt belegt ist

also die 1 läge dann z.b. auf karte  5 , 12 ,40 und 52
die 2 dann auf 1 , 18, 32,41 usw usw  

man ich wusste gar nicht das das so ein gesprächsthema is *g*
Gespeichert

ja ja ich gebs zu ich habe keine ahnung von delphi ;-)
marian19
Full Member
***
Offline Offline

Beiträge: 248



« Antworten #13 am: 28.03.2002, 10:58:39 »

zu erstens:
is ging hier immer noch um ein kartenspiel.... un dich glaube nicht das wenn du heute deine karten mischt und dan die ersten 5 karten ziehst, das das genau die selben sind als wenn du morgen dein kartspiel mischt und dan 5 karten ziehst.... wenn man geld wil verdienen ware das ideal, du wustest immer welche karte kommt.... ich glaube das is nicht sin und zwek eines kartenspiels. und nicht fehler sondern "fehler"
teste mal wenn du dich langweilst folgendes:
statt 52 karten 10000 karten
jetzt machst du unter oncreate dein code---] 5 secunden bis form da is
jetzt machst du unter oncreate mein code---] 0,5 secuden bis form da is

zu zwietens:
es ging mir nicht darum das du eine un endliche loop hast sondern das du (was 99% garantiert ist) ofters als 52 mal random machen must. und jemand der gerne effectief programiert uberlegt sich ne bessere losung.

zu drittens:
vieleicht bin ich auch nur zu doof, aber mit dein code passiert genau das selbe als mit mein code. was bedeuten wurde das du auch "nur" tust mischen und nicht ziehen.....
Gespeichert

Veni Vidi Vici
Loïs Bégué
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1718



WWW
« Antworten #14 am: 28.03.2002, 11:22:23 »

Du must nicht eine doppelte For-Schleife benutzen.Das "aCard: array[1..52] of ..." reicht für alles.

Angenommen, Du "ordnest" die Farbe und die Karten für die Berechnungen wie folgt:
Zitat
Nummer 1 bis 13 : Coeur
Nummer 14 bis 26 : Pique
Nummer 27 bis 39 : Trefle
Nummer 40 bis 52 : Carreaux

ergibt

Type
   eCardFarbe = (ecf_Coeur, ecf_Pique, ecf_Trefle, ecf_Carreau);
und jeweils die
Zitat
1=Karte \"2\"
2=Karte \"3\"
...
12= Karte \"König\"
13= Karte \"AS\"

ergibt

Type
   eCardHoehe = (ech_2, ech_3, ech_..., ech_Koenig, ech_AS);
dann kannst Du aus dem aCard-Wert (bzw. aus dem Wert ind meiner Variable z wenn er aCrad zugewiesen wird) immer wissen um welche Karte es sich handelt:

Zitat
Z Div 4 => die Farbe laut eCardFarbe

Z mod 13 = die Hoehe laut eCardHoehe
Daraus z.B.: benutze ein Case-Konstrukt

Code:
Var

   cFarbe: Integer;

   cHoehe: integer;

Begin

   cFarbe:= aCard[xxx] div 4;

   cHoehe:= aCrad[xxx] mod 13;



   Case cFarbe of

      ecf_Coeur: .......;

      ecf_pique: .......;

      ecf_Trefle: ......;

      ecf_Carreaux: ......;

      end;



   Case cHoehe of

      ech_2 .. ech_10: Showmessage('eine Zahl-Karte');

      ech_Bub..ech_Koenig: Showmessage('eine Figur');

      ech_AS: Showmessage('Ein AS, SUPER ');

      end;

Ist zwar nur ein Beispiel...

Übrigens: eine "bessere" Lösung die nicht funktionniert ist vielleicht nicht so gut wie eine "schlechtere" aber funktionnierende Lösung :o)))
Die Kosten einer Optimierung sollten NIEMALS den Gewinn durch dieselbe übersteigen...
Gruß,
Gespeichert

Prof.Y
Arpoon
Loïs Bégué
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1718



WWW
« Antworten #15 am: 28.03.2002, 11:31:08 »

@marian19:
das Problem mit random ist: es kommt einem "Ziehen mit Zurücklegen" gleich.
Delphi kennt aber kein "Ziehen ohne Zurücklegen", was aber hier benötigt wird.
Deshalb muß dafür gesorgt, daß die Proc nicht vergißt, was gezogen wurde => "aRandom: array..."
Die Konzequenz in dieser Art von Proc ist, wie Du selbst bemerkte, daß man "ungültige" Ziehungen in Kauf nehmen muß...ist zwar nicht "am effizientesten" aber funz.

Wenn Du lust hast, dann kannst Du an einer Prozedure basteln, die das "Ziehen ohne Zurücklegen" implementiert und es uns im Tipp-Bereich von SDC anbieten :-)

Gruß,
Gespeichert

Prof.Y
Arpoon
marian19
Full Member
***
Offline Offline

Beiträge: 248



« Antworten #16 am: 28.03.2002, 11:35:00 »

Zitat
also die 1 läge dann z.b. auf karte 5 , 12 ,40 und 52  
die 2 dann auf 1 , 18, 32,41 usw usw

warum wilst du das so machen?
und nicht einfach
1..13   pik ass..koning
14..26  kruiz ass..konig
27..39 herz ass..konig
40..52 karo ass..konig
Gespeichert

Veni Vidi Vici
marian19
Full Member
***
Offline Offline

Beiträge: 248



« Antworten #17 am: 28.03.2002, 11:42:09 »

Code:
Die Konzequenz in dieser Art von Proc ist, wie Du selbst bemerkte, daß man "ungültige" Ziehungen in Kauf nehmen muß...ist zwar nicht "am effizientesten" aber funz


ich habe nicht gesagt das es nicht fun.(nach kleine anpassungen) sondern wie du schon sagtes nicht effizient. wenn du den test gemacht hast was ich geschrieben hab, wurdes du meiner meinung sein.

//pre : wir haben beide ein array[1..52]
//post:wir haben beide ein array[1..52] mit gemischten nummern gefult

1stens:
ich glaube du hast nichtmal mein code kapiert
2tens
ich brauche nicht zu controlieren ob ich die nummer schonmal gezogen hab......

PS dein tip mit sender as Timage hat geklapt :--)
Gespeichert

Veni Vidi Vici
marian19
Full Member
***
Offline Offline

Beiträge: 248



« Antworten #18 am: 28.03.2002, 11:53:57 »

grrrrrrr
dein tip hat doch nicht geklapt...

ich hab 17 images in einer reihe liegen. und immer sol nur das letzte image verschwinden. und wenn ich jetzt auf 5 klikke verschwindet 5 stat 17
Gespeichert

Veni Vidi Vici
Loïs Bégué
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1718



WWW
« Antworten #19 am: 28.03.2002, 11:58:52 »

@marian19:
war aber nicht von Dir so erklärt worden.
Zitat
das bla bla is bei jedes images das selbe, nur sol unter image16..1.click stehen image16..1.visible := false satt image17...  
wie kan ich das machen ohne 16 mahl den code zu copieren?
Mein Tip tut das was beschrieben war.
Gespeichert

Prof.Y
Arpoon
Seiten: [1] 2 Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006, Simple Machines LLC Prüfe XHTML 1.0 Prüfe CSS