AGB  ·  Datenschutz  ·  Impressum  







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

Zufallszahl ermiteln

Ein Thema von Christian18 · begonnen am 17. Mai 2004 · letzter Beitrag vom 19. Mai 2004
Antwort Antwort
Seite 2 von 3     12 3      
Nicodius

Registriert seit: 25. Apr 2003
Ort: Graz
2.234 Beiträge
 
Delphi 2006 Architect
 
#11

Re: Zufallszahl ermiteln

  Alt 17. Mai 2004, 15:18
FormCreate--> ranodmize;

Aktionsaufruf-->random(maxwert)
Nico Müller
  Mit Zitat antworten Zitat
eroe

Registriert seit: 15. Mai 2004
Ort: Brandenburg
31 Beiträge
 
#12

Re: Zufallszahl ermiteln

  Alt 17. Mai 2004, 16:17
Zitat von sakura:
Zitat von Ultimator:
Es ist zwar besser wenn man es nur einmal aufruft, aber es ist nicht soo Hammer-schlimm, wenn man es öfters macht.
Sicher Es geht a) auf die Performance und b) mindert es die Qualität der Zufallszahlen.

In älteren Delphi Versionen, auf Linux und auf älteren Windows Versionen kannst Du mit folgendem Konstrukt schnell mal 1000 gleiche Zahlen erreichen.

(code) Deswegen, Randomize nur einmal aufrufen.

......
ehrlich ? nach welchem schema werden die "pseudo"-zufallszahlen denn in delphi erstellt ? ich mein wenn das stimmt was du sagst, dann können sie doch gar nich 100% zufällig sein oder ?

PS: soll keine anzweiflung deiner these sein, mich wunderts nur ein wenig
"Der ganze Rummel um die Emanzipation hat nichts daran geändert, dass Frauen sich hübsch machen um Männern zu gefallen"
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Zufallszahl ermiteln

  Alt 17. Mai 2004, 16:21
Zitat von eroe:
....ehrlich ? nach welchem schema werden die "pseudo"-zufallszahlen denn in delphi erstellt ? ich mein wenn das stimmt was du sagst, dann können sie doch gar nich 100% zufällig sein oder ?....
Ein wichtiger Aspekt bei der Initialisierung durch Randomize ist die Systemzeit. Und bei den heutigen Systemen ist eine Schleife von 0 bis 999 halt schneller durchlaufen als sich der relevante Teil der Zeit ändert. Darum sollte Randomize nur einmal (beim Start des Programmes) aufgerufen werden. Sonst wird das "Zufallssystem" immer wieder auf den selben Startwert gesetzt.

Und JA: ECHTE Zufallszahlen werden mit Delphi (kann das über haupt ein normaler PC?) nicht erzeugt.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Zufallszahl ermiteln

  Alt 17. Mai 2004, 16:24
Zitat von eroe:
ehrlich ? nach welchem schema werden die "pseudo"-zufallszahlen denn in delphi erstellt ? ich mein wenn das stimmt was du sagst, dann können sie doch gar nich 100% zufällig sein oder ?
Wie der Name "Pseudo-" schon sagt, sind diese nicht echt. Delphi berechnet diese. Der relavante Teil ist in Delphi 7 wie folgend (ändert sich von Version zu Version)
Delphi-Quellcode:
procedure _RandInt;
asm
{     ->EAX     Range   }
{     <-EAX     Result  }
        PUSH EBX
{$IFDEF PIC}
        PUSH EAX
        CALL GetGOT
        MOV EBX,EAX
        POP EAX
        MOV ECX,[EBX].OFFSET RandSeed
        IMUL EDX,[ECX],08088405H
        INC EDX
        MOV [ECX],EDX
{$ELSE}
        XOR EBX, EBX
        IMUL EDX,[EBX].RandSeed,08088405H
        INC EDX
        MOV [EBX].RandSeed,EDX
{$ENDIF}
        MUL EDX
        MOV EAX,EDX
        POP EBX
end;

procedure _RandExt;
const two2neg32: double = ((1.0/$10000) / $10000); // 2^-32
asm
{       FUNCTION _RandExt: Extended;    }

        PUSH EBX
{$IFDEF PIC}
        CALL GetGOT
        MOV EBX,EAX
        MOV ECX,[EBX].OFFSET RandSeed
        IMUL EDX,[ECX],08088405H
        INC EDX
        MOV [ECX],EDX
{$ELSE}
        XOR EBX, EBX
        IMUL EDX,[EBX].RandSeed,08088405H
        INC EDX
        MOV [EBX].RandSeed,EDX
{$ENDIF}

        FLD [EBX].two2neg32
        PUSH 0
        PUSH EDX
        FILD qword ptr [ESP]
        ADD ESP,8
        FMULP ST(1), ST(0)
        POP EBX
end;
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: Zufallszahl ermiteln

  Alt 17. Mai 2004, 16:25
Zitat von Sharky:
Ein wichtiger Aspekt bei der Initialisierung durch Randomize ist die Systemzeit.
Nicht unbedingt, in Delphi 7 wird der Performance-Counter genutzt, und der ist schnell genug

Delphi-Quellcode:
procedure Randomize;
{$IFDEF LINUX}
begin
  RandSeed := _time(nil);
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
  Counter: Int64;
begin
  if QueryPerformanceCounter(Counter) then
    RandSeed := Counter
  else
    RandSeed := GetTickCount;
end;
{$ENDIF}
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
eroe

Registriert seit: 15. Mai 2004
Ort: Brandenburg
31 Beiträge
 
#16

Re: Zufallszahl ermiteln

  Alt 17. Mai 2004, 16:27
Delphi-Quellcode:
procedure _RandInt;
asm
{     ->EAX     Range   }
{     <-EAX     Result  }
        PUSH EBX
{$IFDEF PIC}
        PUSH EAX
        CALL GetGOT
        MOV EBX,EAX
        POP EAX
        MOV ECX,[EBX].OFFSET RandSeed
        IMUL EDX,[ECX],08088405H
        INC EDX
        MOV [ECX],EDX
{$ELSE}
        XOR EBX, EBX
        IMUL EDX,[EBX].RandSeed,08088405H
        INC EDX
        MOV [EBX].RandSeed,EDX
{$ENDIF}
        MUL EDX
        MOV EAX,EDX
        POP EBX
end;

procedure _RandExt;
const two2neg32: double = ((1.0/$10000) / $10000); // 2^-32
asm
{       FUNCTION _RandExt: Extended;    }

        PUSH EBX
{$IFDEF PIC}
        CALL GetGOT
        MOV EBX,EAX
        MOV ECX,[EBX].OFFSET RandSeed
        IMUL EDX,[ECX],08088405H
        INC EDX
        MOV [ECX],EDX
{$ELSE}
        XOR EBX, EBX
        IMUL EDX,[EBX].RandSeed,08088405H
        INC EDX
        MOV [EBX].RandSeed,EDX
{$ENDIF}

        FLD [EBX].two2neg32
        PUSH 0
        PUSH EDX
        FILD qword ptr [ESP]
        ADD ESP,8
        FMULP ST(1), ST(0)
        POP EBX
end;

ACH KLAR !! jetz wo dus sagst
aber danke schonmal für die erläuterung, hätt ich nich gedacht ..

@ Sharky .. naja, das sie nich 100 % zufall sind war relativ klar, aber ich hätt nich erwartet das sie von so nem unsicheren faktor wie systemzeit abhängen, zumindest nimmer heutzutage ..
"Der ganze Rummel um die Emanzipation hat nichts daran geändert, dass Frauen sich hübsch machen um Männern zu gefallen"
  Mit Zitat antworten Zitat
ajz

Registriert seit: 9. Mai 2004
4 Beiträge
 
#17

Re: Zufallszahl ermiteln

  Alt 18. Mai 2004, 06:30
Zitat von Sharky:
Zitat von eroe:
....ehrlich ? nach welchem schema werden die "pseudo"-zufallszahlen denn in delphi erstellt ? ich mein wenn das stimmt was du sagst, dann können sie doch gar nich 100% zufällig sein oder ?....
Ein wichtiger Aspekt bei der Initialisierung durch Randomize ist die Systemzeit. Und bei den heutigen Systemen ist eine Schleife von 0 bis 999 halt schneller durchlaufen als sich der relevante Teil der Zeit ändert. Darum sollte Randomize nur einmal (beim Start des Programmes) aufgerufen werden. Sonst wird das "Zufallssystem" immer wieder auf den selben Startwert gesetzt.

Und JA: ECHTE Zufallszahlen werden mit Delphi (kann das über haupt ein normaler PC?) nicht erzeugt.
ein normaler pc kann das nicht,
aber ein normaler pc, der in irgendeiner weise mit einer stereoanlage oder einer soundkarte verbunden ist,
mit dem kann man echte zufallszahlen aus dem rauschen der (sound-) chips machen/berechnen.

Line out mit Line in verbinden, rauschen der eigenen soundkarte oder stereoanlage aufnehmen und
die frequenzen des rauschens als grundlage für die berechnung einer zufallszahl nehmen.
d.h. würde das randomize() von delphi nicht mit der systemzeit
sondern mit irgendeinem rauschen von einem soundchip initialisiert, wären die zufallszahlen um einiges
zufälliger...

mfg
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#18

Re: Zufallszahl ermiteln

  Alt 18. Mai 2004, 06:40
Zitat:
ch mein wenn das stimmt was du sagst, dann können sie doch gar nich 100% zufällig sein oder ?
Korrekt, es sind Pseudo-Zufalls-Zahlen, und die sind 100% nicht zufällig, haben aber meistens zu 100% die Statistischen Eigenschaften von Zufall. Umschrieben heist das, die Farbe ist Blau aber eben kein echtes Blau, hat aber die exakt gleichen Eigenschaften wie das echte Blau (eben bläulich). Wenn man also nicht weis das das Pseudo-Blau kein echtes Blau ist dann wird es sehr schwierig das Pseudo-Blau vom echten Blau zu unterscheiden Der Vorteil ist aber das mit dem gleichen Mischungsverhältnis der Zutaten eben immer exakt das gleiche Pseudo-Blau erzeugt werden kann. In unserem Falle ist es gerade eine perfekte und vorzügliche Eigenschaft von Random() das sie mit dem gleichen Zufalls-Seed immer den gleichen Pseudo-Zufall erzeugt. Erst dadurch wird es möglich immer wiederkehrend zufällige Ereignisse zu reproduzieren. Bei echtem Zufall geht dies eben nicht.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#19

Re: Zufallszahl ermiteln

  Alt 18. Mai 2004, 06:45
Übrigens, warte mal Donnerstag ab, dem Männertag, dann kennst du den Unterschied zwischen Blau und Pseudo-Blau

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von p0w3r5tr34m3r
p0w3r5tr34m3r

Registriert seit: 18. Aug 2003
Ort: Monheim am Rhein
153 Beiträge
 
RAD-Studio 2009 Pro
 
#20

Re: Zufallszahl ermiteln

  Alt 18. Mai 2004, 12:39
kannst auch einfach die unit MATH einbinden und dann randomrange(0,100) machen

so long,
Powerstreamer
Florian Cülter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 07:34 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