Zufallsgenerator ohne bereits vorhandene Funktionen wie random()

  • Hi Community,

    rein aus interesse: Wie kann man eine zufällige Zahl generieren ohne schon vorhandene Funktionen zu benutzen?
    Theoretisch könnte man ja eine Bernoulli-Kette (als Laplace-Versuch) nehmen, aber wo bekommt man nun her, ob der obere/untere Pfad genommen werden soll?
    Man könnte aber auch irgendwas, wie die Uhrzeit/Lese- und Schreibgeschwindigkeit als Ausgangswert nehmen und solange auslesen, bis eine Zahl in dem angegebenen Intervall auftaucht...
    Würde es auch klappen mit einer Sinus/Cosinus-Funktion bei einer Funktion und einem zufälligem X-Achsenwert (den man irgendwo herbekommt).?

    Vielleicht habt ihr ja auch noch eine Idee, oder wisst, wie man nicht an andere Dinge (z.B. Zeit) gebunden ist?

    Viele Grüße
    Aquaplant

  • Random gefällt mir ganz gut, ich will nur mal rein aus interesse wissen, wie man so etwas auch anders oder selbst machen könnte; Der Befehl Random ist ja auch nicht einfach so aus dem Boden gewachsen ^^

  • Bei der Prozessorauslastung besteht aber die Gefahr, das sie evt. nur zwischen 1-3% pendelt, dann hätte man immer recht gleiche Werte.
    Mit dem Timer_Init würde es dann so aussehen:

    Spoiler anzeigen
    [autoit]

    #Include <Timers.au3>
    $min = InputBox("Minimum", "")
    $max = InputBox("Maximum", "")
    While 1
    $Rand = StringRight(_Timer_Init(), 3)
    If $Rand <= $max And $Rand >= $min Then
    msgbox(0, "", $Rand)
    ExitLoop
    EndIf
    WEnd

    [/autoit]


    Allerdings werden Zahlen unter 100 mit einer 0 im Hunderter und mit einer weiteren im Zehner bei Zahlen unter 10 angezeigt, was bei der Eingabe von z.B. "4" eine Endlosschleife auslöst. (Ich weiß, kann man beheben.)

    Aber man scheint irgendwie immer einen Bezugswert zu brauchen? Gibt es nicht so etwas wie Algorithmen, die man anwenden könnte? Die fielen dann wahrscheinlich wieder unter schon bekannte Funktionen oder?

  • Hab noch 2 Varianten:

    [autoit]

    #include <INet.au3>

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite(_Random_INET(100, 300) & @CR)
    ConsoleWrite(_Random_MSEC(100, 300, 0) & @CR)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _Random_INET($min, $max)
    Return _INetGetSource("http://www.random.org/integers/?num=1&min=" & $min & "&max=" & $max & "&col=1&base=10&format=plain&rnd=new")
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _Random_MSEC($iMin,$iMax, $iFlag)
    If Not $iFlag Then Return ($iMax - $iMin) * @MSEC / 1000 + $iMin
    Return Int(($iMax - $iMin) * @MSEC / 1000 + $iMin)
    EndFunc

    [/autoit]
  • Die erste Variante ist zwar leicht geschummelt, weil sie auf der bereits bestehenden Funktion, eine Zufallszahl zu generieren, von der Internetseite basiert, aber trotzdem ein interessanter Lösungsweg. Problematisch wird es nur, wenn man kein Internet hat.
    Die zweite Idee ist auch wieder mit der Zeit verbunden.
    Scheint wohl ein etwas kompliziertere Thematik zu sein, "einfach mal so" eine Zufallszahl zu generieren.

  • hier noch eine einfache Variante, die nur Anzahl Stellen festlegt.
    Das ist aber sicher noch erweiterbar.

    [autoit]


    MsgBox(0, '', _MyRandom(15))

    [/autoit][autoit][/autoit][autoit]

    Func _MyRandom($anzahlStellen)
    Local $t
    For $i = 1 To $anzahlStellen
    Sleep(12)
    $t &= StringLeft(StringRight(@MSEC,1),2)
    Next
    Return $t
    EndFunc

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Danke Pee und Danke Aquaplant.
    Die Frage hatte ich mir auch schon gestellt.
    Heisst das jetzt das alle Sparachen auch nur pseudo Zufallszahlen erzeugen?

    Zitat von Albert Einstein

    Das wo unsere Berechnungen versagen nennen wir Zufall

    mfg Ubuntu

  • Schade, dass es nicht eine "einfache" Lösung gibt, aber die mit der Zeit ist dann glaub ich immer noch die beste - wenn man dann noch ein paar rechnungen einbaut kann man auch größere Zahlen darstellen.
    Und by the way: Wie könnte man denn die Lese-/Schreibgeschwindigkeit mit Autoit auslesen?

  • Wie könnte man denn die Lese-/Schreibgeschwindigkeit mit Autoit auslesen?

    Die Frage ist mir etwas unklar... meinst du sowas:

    [autoit]

    $timer = TimerInit()
    FileOpen("test.txt",0) ; 0 = lesemodus
    MsgBox(64,"benötigte Zeit",TimerDiff($timer))

    [/autoit]
  • Das wäre ja jetzt die Zeit, nur für ein einzelnes Objekt, ich mein aber eher die gesamte. Die Festplatte wird ja durchgehend gelesen und geschrieben. (NTUSER.dat z.B. oder andere temporäre Daten) Die Geschwindigkeit mein ich