Gleichverteilte Zufallsdoubles erstellen.

Status
Nicht offen für weitere Antworten.

rookeenator

Mitglied
Hi,

ich muss per Zufall doubles generieren zwischen einer Ober- und einer Untergrenze.
Das mache ich zur Zeit wie folgt:

double d = (obereSchranke - untereSchranke) * Math.random() + untereSchranke;

Das funktioniert auch wunderbar. Allerdings nicht für große Schranken.

Angenommen es gilt:
obereSchranke = Double.MAX_VALUE;
untereSchranke = -Double.MAX_VALUE;

Dabei kommen nur riesig-große oder riesig-kleine Werte raus, wobei allerdings auch mal zBsp. 10 oder 0 rauskommen sollte. Das Ergebnis ist also auf gar keinen Fall gleichverteilt!
Das liegt daran, dass Math.random() zwar eine Zahl zwischen 0 und 1 liefert, allerdings ist diese nie "sehr" nah an 1 oder "sehr" nah an 0, sodass diese Zufallszahl keinen wirklichen Einfluss auf den "extremen" Wert in der Klammer hat.
Es kommen ausschliesslich Zahlen der Größenordnung (+/-)10^306 bis (+/-)10^307 heraus, was ja sehr nah an den MAX_VALUE's liegt (10^308).

Gibt es eine Möglichkeit in diesem Wertebereich wirklich gleichverteilte doubles zu erhalten??? Gibt es irgendwelche Generatoren die das wirklich drauf haben? Bzw eine Idee/Vorschlag wie man das mathematisch machen könnte?
Das RNGPack zbsp (http://www.honeylocust.com/RngPack/) scheint das selbe Problem zu haben.

Gruß,
rookeenator
 

kaie

Bekanntes Mitglied
Was soll denn Deiner Meinung nach bei Double.MAX_VALUE-(-Double.MAX_VALUE) rauskommen? 2*Double.MAX_VALUE? Was meinst Du, wofür das MAX in MAX_VALUE steht? Bei mir kommt (wie nicht anders erwartet) einfach INFINITY raus - egal, welchen Wert Math.random() liefert...

Vielleicht solltest aus praktischen Überlegungen bei einem Wertebereich bleiben, der nicht die Anzahl der Atome im Universum um einige Hundert Zehnerpotenzen übersteigt...
 

rookeenator

Mitglied
Ja klar, sorry war mein Fehler. Die Berechnung sähe so aus:
double d = ((obereSchranke/2 - untereSchranke/2) * Math.random() + untereSchranke/2) * 2;
Womit das INFINITY-Problem gelöst ist, und ansonsten "richtige" Werte geliefert werden.

Im Moment verwende ich den o.g. RandomGenerator dem ich einfach meine beiden "großen" Schranken übergebe. Dort gibt es allerdings wie gesagt das selbe Problem. Die Formel oben soll also nur zur Illustration des Problems herhalten.

Einfach den Wertebereich weiter einschränken geht leider nicht, da ich auf Zufallszahlen aus diesem riesigen Wertebereich angewiesen bin.

Irgendwelche Ideen?
 
S

SlaterB

Gast
wenn du Random nicht vertraust, dann bau das dir das ganze selber,
anschaulicher aus einfacheren Zufallszahlen:

dann lasse dir 30x eine Zufallszahl von (1 bis einschießlich 10.000.000.000) -1
oder ähnlich ausgeben (die -1 um auch die 0 zu bekommen),

diese 30 Zahlen füge zusammen, also:
30.ste Zahl + 29.Zahl * 10^10 + ..

dann hast du eine tolle Gleichverteilung

-----------

damit nun eine Zahl wie 5 rauskommt,
muss übrigens der kleine Zufallsalgorithmus 29x 0 ausgeben,
die Wahrscheinlichkeit dazu ist
(1 zu 10 Milliarden) ^30 oder so ;)
wenn du eine solche Zahl triffst, dann Hut ab,

-----------

hast du vielleicht eine andere Vorstellung von Gleichverteilung?,
z.B. Gleichverteilung des Exponenten von 0 bis 300?
 

kaie

Bekanntes Mitglied
Dein Ergebnis ist vollkommen korrekt, Deine Zahlen SIND tatsächlich gleichverteilt. Du deutest die Ergebnisse nur falsch!

Hier ein Programm, dass ein paar Verteilungen mit jeweils 10000 Werten erwürfelt und davon je ein Histogramm (mit 10 Unterteilungen) erstellt:
Code:
public class Zufall
{
	public static int[] verteilung( double min, double max )
	{
		int[] n = new int[10];
		for( int i=0; i<10000; i++ )
		{
			double z = (max-min)*Math.random()+min;
			n[(int)((z/10000-min/10000)*10/(max/10000-min/10000))]++;
		}
		return n;
	}
	
	public static void ausgabe( int[] n )
	{
		for( int i=0; i<n.length; i++ )
		{
			System.out.print( n[i]/100+"%\t" );
		}
		System.out.println();
	}
	
	public static void main( String[] args )
	{
		ausgabe( verteilung(0,10) );
		ausgabe( verteilung(0,10000) );
		ausgabe( verteilung(-10000,10000) );
		ausgabe( verteilung(-Double.MAX_VALUE/2,Double.MAX_VALUE/2) );
	}
}
Es können bei Dir durchaus Werte von 5 oder -12 oder so erwürfelt werden; die Wahrscheinlichkeit dafür beträgt nur leider etwas um die 1/(2^300), was in etwa dem Kehrwert eines Gogols entsprechen dürfte! Also: SEEEEEEEEHR unwahrscheinlich!
 
S

SlaterB

Gast
wenn man es ein bisschen genauer nimmt ist es aber eher in der Region 10^300 oder?
nicht dass es drauf ankäme ;)
 

rookeenator

Mitglied
Danke für die vielen Antworten... nun ja, also scheint es ja doch so in Ordnung zu sein. Allerdings bräuchte ich schon öfter mal Punkte in "günstigeren" Größenordnungen.

Was denkt Ihr über das folgende Beispiel (RanMT ist eine Klasse des o.g. Packs):
Code:
RanMT r = new RanMT(seed);
double d = r.uniform(-10, 10) * Math.pow(10, r.uniform(0,307));

Das liefert mir jedenfalls brauchbarere Ergebnisse. Die Frage ist nun ob das ganze auch annähernd gleichverteilt ist. Für die 0 gillt das auf jeden Fall nicht, da diese wahrscheinlicher ist, als alle anderen Zahlen - das wäre allerdings nicht ganz so tragisch, wenn der Rest wenigstens ungefähr gleichwahrscheinlich ist. Hat für mich erstmal so den Anschein.
Oder übersehe ich da jetzt etwas Kritisches?

PS: Die Rechnung oben mit dem Halbieren der Schranken und dem anschließenden Verdoppeln des Ergebnisses ist übrigens falsch, da so ja nur gerade Zahlen generiert werden. :applaus:
 
S

SlaterB

Gast
bevor du an Algorithmen und deren Beurteilung denkst,
überlege lieber erstmal ganz genau, welche Zahlen du in welcher Verteilung haben möchtest,

0,1,2,..,9,10,20,30,..100,200,300,..?

bis wohin geht das ganze?
wenn du die Gesamtzahl aller Zahlen hast, z.B. 6000 und die gleichverteilt sein sollen,
dann mach folgendes: mit Wahrscheinlichkeit 1/6000 ist es 0,
ansonsten Zufallszahl 1-9, Zufallsexponent 0-307, Zufallsvorzeichen + oder -
 

rookeenator

Mitglied
SlaterB hat gesagt.:
bevor du an Algorithmen und deren Beurteilung denkst,
überlege lieber erstmal ganz genau, welche Zahlen du in welcher Verteilung haben möchtest,

0,1,2,..,9,10,20,30,..100,200,300,..?

bis wohin geht das ganze?
wenn du die Gesamtzahl aller Zahlen hast, z.B. 6000 und die gleichverteilt sein sollen,
dann mach folgendes: mit Wahrscheinlichkeit 1/6000 ist es 0,
ansonsten Zufallszahl 1-9, Zufallsexponent 0-307, Zufallsvorzeichen + oder -


Schon etwas alt das Thema mittlerweile aber vielleicht noch ein paar Worte dazu:
So wie Du das vorgeschlagen hast, dachte ich es mir eben auch - allerdings ist das definitiv nicht gleichverteilt, weil alle Zahlen mit Exponent n genauso wahrscheinlich sind, wie alle Zahlen mit Exponent n+1. Letzterer hat allerdings 10-mal so viele Zahlen, somit ist für diese Zahlen die Wahrscheinlichkeit geringer. Man erhält auf diese Weise eine eckige oder stufenförmige Normalverteilung!
Mein Problem lässt sich also gar nicht lösen: Entweder ich verwende eine Normalverteilung oder ich habe Pech gehabt und muss mit den großen Zahlen leben! :)

Viele Grüße...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M nicht gleichverteilte Zufallszahlen generieren Allgemeine Java-Themen 6
Ernesto95 Maven Lauffähige exe mit JRE erstellen. Mögliche Wechselwirkung mit bereits installierter JRE ? Allgemeine Java-Themen 1
MJannek eigene Annotation erstellen die einen Konstruktor erzeugt: Allgemeine Java-Themen 8
Zrebna Testkonzept erstellen - Verständnisschwierigkeiten Allgemeine Java-Themen 6
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
berserkerdq2 SceneBuilder GUI erstellt, nun muss ich noch ein Polygon erstellen, ist die Connection möglich? Allgemeine Java-Themen 3
berserkerdq2 Was heißt es mit FXML Listener zu setzen ind Buttons zu erstellen? Allgemeine Java-Themen 6
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
D Open Source Library zum erstellen von PDFs Allgemeine Java-Themen 1
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
J Power Point erstellen inklusive Diagramm Allgemeine Java-Themen 12
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
N Tree erstellen Allgemeine Java-Themen 8
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
berserkerdq2 Kann keine Labels erstellen, was ist hier syntaktisch falsch Allgemeine Java-Themen 5
G Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Trace-Tabelle erstellen Allgemeine Java-Themen 3
M Excel Datei Erstellen Allgemeine Java-Themen 2
OnDemand Erstellen von Quartz Jobs pro Aufgabe oder zusammenfassen Allgemeine Java-Themen 7
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
R Geometry erstellen die abhängig von Variablen ist Allgemeine Java-Themen 6
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
Avalon DTO aus mehrere Entitäten erstellen Allgemeine Java-Themen 5
Kirby.exe Distanz Map für die Distanztransformation erstellen Allgemeine Java-Themen 1
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
M Registry Autostart Eintrag mit Java erstellen (über Windows cmd) Allgemeine Java-Themen 7
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
B Datei/Ordner auf Server zugreifen/erstellen Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
M Rectangle mit Java erstellen? Allgemeine Java-Themen 9
G Fläche erstellen mit Entfernungen Allgemeine Java-Themen 1
E Eigenen "Aufzählungstyp" erstellen - mit enum ? Allgemeine Java-Themen 18
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
B Rangliste erstellen Allgemeine Java-Themen 13
D 2,3-Baum rekursiv erstellen Allgemeine Java-Themen 20
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
L SQL Datei in Eclipse erstellen Allgemeine Java-Themen 3
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
E Ts3API Subchannel erstellen und rein moven !! Allgemeine Java-Themen 0
J Eigene Api erstellen und dann auch verwenden - Ordnerstruktur Allgemeine Java-Themen 1
S GetMethode erstellen mit Hilfe von Parametern Allgemeine Java-Themen 9
T 2D-Grafik Chart als Image erstellen Allgemeine Java-Themen 3
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
S Compiler-Fehler IntelliJ Projektdatei lässt sich nicht erstellen. Allgemeine Java-Themen 15
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
E Swing Buttons auf knopfdruck(anderer Button) erstellen Allgemeine Java-Themen 6
S TestNG Eclipse: Reporting erstellen/ verändern Allgemeine Java-Themen 0
F .jar erstellen und starten Allgemeine Java-Themen 15
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
N 1000 MQTT Messages die Sekunde - 1000 Threads erstellen ? Allgemeine Java-Themen 10
Tommy Nightmare Klassen Globale Klassen erstellen Allgemeine Java-Themen 7
K Datei (CSV-ähnlich) in Java einlesen & mit teil der Daten Graphen erstellen Allgemeine Java-Themen 9
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
T 32-Bit Applikationen mit Eclipse erstellen Allgemeine Java-Themen 4
R Input/Output RTF erstellen? Allgemeine Java-Themen 2
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
S Klassen Klassen "virtuell" erstellen Allgemeine Java-Themen 5
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
M Dokument erstellen Allgemeine Java-Themen 0
S Java API für GitHub erstellen Allgemeine Java-Themen 14
T Ant Jar Datei per Ant in Eclipse erstellen Allgemeine Java-Themen 2
4a61766120617274697374 Hintergrundjobs(tasks) in Java erstellen Allgemeine Java-Themen 3
K Eigene API erstellen? Allgemeine Java-Themen 13
N Benutzeroberfläche erstellen Allgemeine Java-Themen 5
Thallius Eigenes Message Center erstellen Allgemeine Java-Themen 3
perlenfischer1984 Mehrere Komponenten erstellen Allgemeine Java-Themen 3
B jni - Headerdatei erstellen Allgemeine Java-Themen 3
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
I Methoden Schnelle Hilfe benötigt - Kleines Video/Slideshow aus mehreren Bildern erstellen Allgemeine Java-Themen 3
B automatisch benannte arrays erstellen Allgemeine Java-Themen 9
F URI-Scheme mit Java unter MacOS erstellen? Allgemeine Java-Themen 0
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
M Textfile erstellen Allgemeine Java-Themen 11
L Wie kann ich einen Keystore aus existierenden Zertifikaten erstellen? Allgemeine Java-Themen 1
K Fehler beim erstellen von .jar Datei Allgemeine Java-Themen 3
D Ordner auf Desktop erstellen(Pc unabhängig) Allgemeine Java-Themen 5
T Dll erstellen und einbinden Allgemeine Java-Themen 1
M Exceltabelle in Java erstellen und Werte einlesen Allgemeine Java-Themen 32
P Eigenstehende *.exe Datei erstellen Allgemeine Java-Themen 15
R Test Umgebung für Datenbank erstellen, was braucht es? Allgemeine Java-Themen 14
B MySQL Eintrag erstellen Allgemeine Java-Themen 3
Thallius PDF von einem BufferedImage erstellen Allgemeine Java-Themen 1
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
3 Backup von h2-Datenbank-Datei erstellen Allgemeine Java-Themen 6
S ImageMap erstellen Allgemeine Java-Themen 1
A Spielemap erstellen Allgemeine Java-Themen 2
F URI Schema in Linux erstellen? Allgemeine Java-Themen 3
P Matrix erstellen Allgemeine Java-Themen 1
C Ein Array mit der Größe von 1 KB erstellen Allgemeine Java-Themen 3
A Daten in Formularen/Vorlagen erstellen und ausdrucken Allgemeine Java-Themen 3
GianaSisters Apache POI - Hyperlink erstellen Allgemeine Java-Themen 0
Zettelkasten Vektor mit Koordinaten erstellen Allgemeine Java-Themen 2
D Grafisches Frontend zu einem Java Prozess erstellen Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben