Java (pseudo)zufallszahl komplett selber

JJJT

Lt. Commander
Registriert
Feb. 2008
Beiträge
1.943
Also wir brauchen für einen Teil eines Programms einen pseudo Zufallsgenerator, der Zahlen zwischen 1 -3 ausspuckt.

Wir dürfen dafür aber nicht auf die klasse Math zurückgreifen.

Wir haben probiert selber einen Alghoritmus zu schreiben, aber der wirft natürlich immer die gleiche Zahlenfolge raus, also ist zu 100% vorhersehbar. Das darf natürlich nicht sein. Er muss schon irgendwie alternieren, auch wenn man mit einigen Versuchen dahinter kommen würde.

Ich hoffe ich hab mich klar ausgedrückt ;-)

Weiss einer Rat?
 
hatte mal was davon gelesen dass man das mithilfe von variablen wie der uhrzeit machen kann, ich weiß nicht ob du dich damit auskennst... ich hab nie java programmiert... :p
 
Bauchgefühl: zeit modulo 3 plus eins?

Wenns weniger einfach zu durchschauen sein soll: (unstetige funktion an der stelle zeit modulo 3) plus eins?

Edit: Also Zeit im Sinne von aktuelle Millisekunden *1000. Da kommt dann schon halbwegs zufälliger Käse dabei raus :)
 
Also soweit ich weiß, rechnet die Math.random() - funktion auch mit der Systemzeit.
Hol dir doch einfach die aktuelle Uhrzeit in Millisekunden mit (Date)System.currentTimeMillis() und wende ein paar mathematische Berechnungen drauf an, so dass dann halt Zahlen zw. 1 und 3 rauskommen.
Was anderes fällt mir jetzt in Java auch nicht ein.

Gruß Timo
 
int zufall = (int) (System.nanoTime()%3)+1;

Und jetzt ab ins Bett mit dir! :p
 
Danke erstmal für die antworten!
ja an die Zeit hab ich auch gedacht, aber auf die dürfen wir auch nicht zurückgreifen.
Also wir haben damit keinerlei möglichkeit einen "echten" zufallsgenerator zu schreiben, es soll auch nur so wirken...

Wie das gehen soll ist uns einfach nicht klar, ein tutor meinte nur mithilfe der fibonacci Folge würde es gehen, aber selbst mit der kommt bei uns immer exakt die gleiche zahlenfolge raus. Wieder 100%ig vorhersehbar...

p.s. ja ins bett würde ich gerne, geht aber erst wenn wir das gelöst bekommen ;-)
 
der einfachste Zufallszahlengenerator, der mir einfällt und nicht gefrickelt ist: LFSR

Ein Zufallszahlengenerator produziert immer die gleichen Ergebnisse, das ist komplett natürlich, da dieser deterministisch ist. Es können erst versch. Ergebnisse kommen, wenn du ihn jeweils mit anderen Startwerten startest, und da steckt die Kunst.
 
Du musst ja schon irgendeinen Startwert haben, der sich zur Programmausführung ändert. Das kann z.B. die Prozess-ID sein :)
 
Was für eine mischugge Aufgabe, schreib mal die komplette Aufgabenstellung ab.
 
Geht das: du machst dir ne for Schleife, erstellst dadrin immer ein Objekt und berechnest anhand der ID des Objektes deine Zufallszahlen (aber am Ende das Objekt wieder löschen ^^)?
 
klar ist die meschugge!

wir sollen eine "KI" für schere stein papier schreiben. Dürfen dabei aber auf keinerlei vorgenerierten zufallszahlen (auch mit hilfe der zeit) zurückgreifen. Die KI soll dabei auch nicht intelligent sein, aber nicht immer das gleiche machen, so dass man sie sofort durchblickt.
Ob man sie jetzt nach 5 -6 Spielen raus hat ist dann egal.

Das waren die Worte der Zuständigen Leute zu dieser blöden Aufgabe

Wir dürfen auf keine Objekte oder methoden zurückgreifen. Es soll "super basic" sein
 
Das geht so aber nicht. Wie geschrieben brauchst du etwas, das nicht bei jedem Programmaufruf gleich ist. Dazu _musst_ du auf etwas anderes Zugreifen als deine eigene Klasse. Sei es auch nur einen Zähler zu schreiben, der beim Programmstart um eins erhöht wird und beim Beenden in eine Datei gespeichert wird.

Oder du lässt dir in dem Zufallszahlen-Methodenaufruf eine Zahl übergeben, die du dann intern als Startwert nimmst und verlagerst das Problem an eine andere Stelle.
 
Zuletzt bearbeitet:
Edit: Ok, selbst gesehen das geht nicht :D

User gibt sein Stein,Schere,Papier ein (1,2,3) und du addierst einfach 5 dazu um dann am Ende über Modulo 3 + 1 dein Ergebnis zu bekommen?
 
@ antred
der war gut ;-)

Jo wir haben auch keinen plan. Es soll ja auch nur zufällig wirken...
Naja ich koppel dass jetzt einfach mal an die Eingabe des spielers, dann wirkt es pseudo zufällig.
Was ein blödsinn das ganze!
 
Naja, ich halte die Aufgabe für unmöglich zu lösen mit den Vorgaben.
Mir fällt momentan kein mathematischer Weg ein, der eine Zufallszahl generiert. Das wäre ja auch zu schön, wenn man einfach über Mathematik Zufallszahlen generieren könnte. Grobgefasst würde so eine Zahl bedeuten:
- Sie hat potentiell unendlich Stellen.
- Sie ist von variabler Länge.
- Sie basiert nicht auf äußeren Faktoren.
Allein der erste Punkt kann nicht von einem Rechenschieber erfüllt werden, da dieser stets definierte Grenzen besitzt.

Außerdem ist es ohne externe, nicht beeinflussbare Faktoren niemals wirklich random. Selbst Math.random() erstellt meines Wissens nach nur Zahlen, die so stark random sind, dass sie extrem viele Versuche benötigen, um erratbar zu sein. Dann gibt es Wege über externe Sensoren oder Programmeigenschaften (z.B. der gerade zugeordnete Speicherbereich), die jedoch selber nur ein höheres Maß an Zufall bieten, aber trotzdem imitierbar bleiben. Wenn man es absolut genau nimmt, ist selbst unser Hirn nicht zu richtigem Zufall fähig, da die Anlagen unser Nerven den Denkprozess definieren. Wenn jemand also sagt "denk dir eine Zahl zwischen 1 und 10", wählt dein Hirn aufgrund seiner Kenntnisse und nicht vollkommen random. Der gute alte Stein zeigt das gut :)

Lös es am besten über irgendeine Eigenschaft deiner Software zur Laufzeit und frag den Aufgabensteller, wie er sich randomzahlen auf reinem mathematischen Wege vorstellt.

Wäre auch super, wenn du im Nachhinein mal seinen Lösungsvorschlag posten könntest. Bin da sehr gespannt.
 
Erinnert mich an die Programmierhausaufgabe Informatik Studium.
Man kann schon relativ einfach ein Zufallszahlengenerator bauen.

Vorallem wenn man math.random nicht nutzen darf...

Aber bissel Nachdenken und die Mathevorlesung verfolgen und du kommst auf die Lösung.
Bzw. die Scripte der Profs checken - denn diese Algos bauen auf den Vorlesungen auf.
 
kannst du mit irgendwelchen funktionen machen. Zum Beispiel so:
Linearer Kongruenzgenerator:
Xn+1 = (aXn + b) mod m

oder per Middle Square Method (einfach mal googlen, wikipedia seite erklärt ganz gut.

Alternativ kann man zufallszahlen auch aus kryptografischen algorithmen erzeugen. beispielsweise aus rsa.
Außerdem ist es ohne externe, nicht beeinflussbare Faktoren niemals wirklich random.

Deswegen ja auch das "pseudo" davor. wirkliche zufallszahlen gewinnt man nur durch wirklich zufällige ereignisse. z.b. münzwurf, zerfall von uran, sonnenflecken etc.
 
Zuletzt bearbeitet:
Shagg schrieb:
kannst du mit irgendwelchen funktionen machen. Zum Beispiel so:
Linearer Kongruenzgenerator:
Xn+1 = (aXn + b) mod m

oder per Middle Square Method (einfach mal googlen, wikipedia seite erklärt ganz gut.

Alternativ kann man zufallszahlen auch aus kryptografischen algorithmen erzeugen. beispielsweise aus rsa.
Aber dafür brauchst du natürlich auch Parameter. Wenn die konstant sind kommt ja auch immer das gleiche raus.

Und genau das ist der Punkt:
Ohne eine irgendwie zufällige Eingangsgröße (und sei es die Uhrzeit) kann ein Computer keine "zufällige" Zahl erzeugen. Wie auch? Sie muss ja berechnet werden, weil (wie einer meiner Professoren mal zu sagen pflegte) "der Blechdepp kann halt nix anderes." :p

So wie die Aufgabe gestellt ist, ist sie nicht lösbar. Wenn du auf keinerlei zufällige Größen wie Zeit o. Ä. zugreifen kannst, kannst du keine (Pseudo-)Zufallszahl generieren.
 
Naja ich koppel dass jetzt einfach mal an die Eingabe des spielers
Find ich ne gute Idee wenn man sonst nichts "zufälliges" hat.
Berechne zB aus dem eingegebenen Namen nen String-Hash oder rechne irgendwas ausgedacht bescheuertes wie "Länge des Namens + Geburtsjahr % 3"
Du könntest auch die Mausbewegung aufzeichnen und damit was machen - müsstest nur durch die GUI dafür sorgen, dass man die Maus benutzen muss.
 
Zurück
Oben