Java (pseudo)zufallszahl komplett selber

Bspw. in PHP mit pi:
PHP:
$Seed = mt_rand() / mt_getrandmax();
$PI = pi(); // alternativ 4 * atan( 1 )

$Seed += $PI;
$Seed = pow( $Seed, 8 );

$rnd = floor( $Seed );
$Seed -= floor( $Seed );

return $rnd % $Max;
 
Hier holst du schon eine Zufallszahl mit mt_rand() ab und wendest ein paar konstante Funktionen drauf an (wozu auch immer...), da kannst du ja auch gleich die Zufallszahl verwenden...

Zufallszahl (n=0) = floor(($random + pi)^8) ((Edit: richtig: ($random + pi)^8))

Zeile 8 ändert nur den Seed auf eine andere Zahl, die wieder von $random abhängt (falls die Funktion nicht ohnehin oben $Seed aus einer Zufallszahl nehmen würde)
Zufallszahl (n) = floor((Zufallszahl(n-1) - floor(Zufallszahl(n-1)) + pi)^8) ((Edit: richtig: (Zufallszahl(n-1) - floor(Zufallszahl(n-1)) + pi)^8))

Im Endeffekt muss man trotzdem die erste Zufallszahl zufällig wählen, sonst hat man erst wieder die komplett gleiche Zahlenfolge

Achja:
Zeile 8 scheint auch nicht allzu großartig zu funktionieren, siehe (mit Seed = 1):
http://www.wolframalpha.com/input/?i=+f%280%29%3Dfloor%28%281%2Bpi%29^8%29%2C+f%28n%29%3Dfloor%28%28f%28n-1%29-floor%28f%28n-1%29%29%2Bpi%29^8%29
Die Funktion läuft nur mehr statisch nach dem ersten Seedwechsel, kann aber auch sein, dass ich mich verschrieben/vertan habe.

(Edit:
Ja, ich habe Mist gebaut - da oben sind 2 floor-Funktionen zu viel (die werden ja nur bei der Ausgabe verwendet!

Hier der korrekte Plot etc.:
http://www.wolframalpha.com/input/?i=+f%280%29%3D%281%2Bpi%29^8%2C+f%28n%29%3D%28f%28n-1%29-floor%28f%28n-1%29%29%2Bpi%29^8
)

Die Lösung wird wohl sein, irgendwelche anderen externen Parameter zu finden, die nicht statisch sind: Benutzereingabe, Uhrzeit, Prozessid, Speicherbereich in dem das Programm liegt... und mit dem dann eine beliebige Folge zu seeden, die möglichst zufällig verläuft.

Falls du Zeit selbst nicht abfragen darfst könntest du versuchen, Code (z.B. eine Fibonaccifolge) eine gewisse fixe Zeit laufen zu lassen (k.A. ob das mit Java leicht möglich ist), dabei sollte je nach Computerlast auch nicht immer das gleiche Ergebnis geliefert werden.
 
Zuletzt bearbeitet:
Kannst auch in einem Parallellaufenden Thread einen Counter alle kA 100ms hochzählen lassen und von dem einfach immer den aktueleln state abfragen und %3.
 
Du kannst auch noch von allerlei erzeugten Objekten in Deiner Klasse (auch this falls nicht static und Strings) den Hash-Wert ( obj.hashCode() ) holen und mit in Zufallszahlenerzeugung miteinbeziehen.

Edit:
MouseListener erzeugen und die Koordinaten für Random verwenden .. event.getX() und event.getY()

Falls der User Eingaben macht, Zeiten zwischen den Eingaben (evtl. Zeiten zwischen einzelnen Tastendrücke falls eigene GUI)
 
Zuletzt bearbeitet:
Zurück
Oben