Zufallsnamengenerator

Stapf_JAVA

Mitglied
Hi!
Ich habe einen Namensgenerator erstellt der einer Stringvariable Vorname + Nachname zuweist.
Die Zuweisung ist zufällig. Ich erzeuge den Zufall mit Hilfe der Klasse Random und der mehtode nextint(300).
(Ich habe 2 Textdateien in welchen 300 Vor- bzw Nachnamen stehen. In jeder Zeile steht nur ein Name.) Momentan lese ich eine Zeile mit einem BufferedReader und der Methode readLine() ein. Ich lese entsprechend oft ins Leere. Wird als0 300 gewürfelt, lese ich 300 mal ein. Die Funktion ist gegeben. Nun ist meine Frage allerdings was ich besser machen kann. z.B dass das Programm performanter wird
Wäre es besser einen String[300]-Array anzulegen als die vielen Zugriffe auf die Textfiles??

Eine weitere Frage betrifft die Wahrscheinlichkeit. Bis jetzt liegt eine Gleichverteilung vor. Ich möchte allerdings dass häufig vorkommende Namen öfter verwendet werden als andere. Die Reihenfolge der Häufigkeit/Wahrscheinlichkeit ist schon gegeben. (Der erste Name ist am wahrscheinlichsten, der 300. am unwahrscheinlichsten. Erster Zeile der Textdatei für Nachnamen ist z.B. Müller.) Dieses Wahrscheinlichkeitsgefälle könnte z.B linear sein. Ich will keinesfalls jedem Namen ein Eigenes p(x) zuordnen.

Danke schonmal.
Gruß
 

Der Müde Joe

Top Contributor
>Wäre es besser einen String[300]-Array anzulegen als die vielen Zugriffe auf die Textfiles??

Stell dir vor du hast im Keller 300 Bier. Wenn ein Bier leer ist holst du eine neues im Keller.
Variante 2: Du holst alle 300 Bier auf einmal aus dem Keller und stellst sie in den Kühlschrank
neben dem Sofa.
;-)

>Bis jetzt liegt eine Gleichverteilung vor. Ich möchte allerdings dass häufig vorkommende Namen öfter verwendet werden als andere.

Wenn du Radom öffters aurfust, kommst du immer näher an die Mitte ran. Sprich wenn du bei 1000 nextInt(300) calls den Durchschnitt nimmst, landest du so ca bei 150.
 

Stapf_JAVA

Mitglied
ok Danke!
Ich nehme mal an, dass soll heißen ein Array anlegen ist besser. Wie sieht es aber aus wenn ich z.B nur einen Namen brauche. Ist es da nicht schlechter 2 Arrays mit z.B. 1000 Elementen zu erzeugen (= 2000Elemente). Bei 2 benötigten Elementen?? Diese Frage ist durchaus ernst gemeint!!



Entspricht dass dann nicht eher einer Gaussverteilung?? Ich hätte es wirklich gerne so, dass 0 am wahrscheinlichsten ist und 300(bzw der Maximalwert) am unwahrscheinlichsten.

Gruß
 

Andi_CH

Top Contributor
Erste Idee du speicherst die Namen entsprechend häufig ab - dann kommen die auch entsprechend häufig

Code:
Müller
Müller
Müller
Müller
Gerber
Keller
Keller
Merkel

Ansonsten musst du genau wissen welche Indizes die Namen haben und wie häufig die vorkommen und das was basteln

Also die Randoms nicht linear über den Bereich verteilen sondern mit einer nichtlinearen der Häufigkeit entsrechenden Kurve, aber die müsste erst mal als Formel vorliegen
 

Stapf_JAVA

Mitglied
Ansonsten musst du genau wissen welche Indizes die Namen haben und wie häufig die vorkommen und das was basteln

Die Idee mit dem oft abspeichern hatte ich auch schon. Ist allerdings viel Arbeit bei 300 Namen (Anzahl soll später auch erweitert werden). Ich hatte schon vor die Reihenfolge zu nutzen. Denn diese entspricht dem Vorkommen der Namen in Deutschland (Quelle: Telefonbuch)
 

XHelp

Top Contributor
Weißt du denn, wie oft man es braucht? Glaube ich eher nicht...
Plan B wäre folgendes:
20 Namen aus der Datei rausziehen, und abspeichern. Jedes mal, wenn du einen Zufallsnamen brauchst, gibst du den 1,2,3 usw. Wert. Wenn du beim 20. angekommen bist, dann ziehst du dir eben 20 neue Werte. Ob das so Sinn macht, liegt natürlich an der Häufigkeit.

Zu der Verteilung könntest du dir etwas mit dem Modulo überlegen:
Du hast n-Namen. Du suchst dir jetzt eine Zahl im 2*n Bereich. Wenn die Zahl >n ist, dann rechnest du modulo n/2, dadurch kriegst du Ergebnisse in der 1. Hälfte schon mal 3 mal so häufig. Du kannst den Zahlenbereich erweitern und modulo Schritt für Schritt immer kleiner machen, dadurch kriegst du auch die stufenartige Struktur hin.
 

Andi_CH

Top Contributor
Ist eigentlich kein grosser Aufwand wenn die Häufigkeiten als Zahlen vorliegen
Schreib ein Bonsaiprogramm ( Aufwand ist etwa "hello world" * 5) das dir die Namen mit den Häufigkeiten einliest und den Namen entsrpechend oft in eine andere Datei schreibt.

Den anderen Weg halte ich für unmöglich - du wirst wohl keine mathematische Formel finden die das Beschreibt
 

Der Müde Joe

Top Contributor
>Entspricht dass dann nicht eher einer Gaussverteilung?? Ich hätte es wirklich gerne so, dass 0 am wahrscheinlichsten ist und 300(bzw der Maximalwert) am unwahrscheinlichsten.

Kannst es ja einfach Umrechnene:

Sprich untere hälfte: 0 -150 : 0 klein, 150 hoch
obere hälfte 150 - 300: 150 hoch, 300 klein

Da du dich Durchschnittlich an 150 annäherst (bei mehreren random calls) ist die Wahrscheinlichkeit in der Mitte am grösten.
Dann brauchst du noch eine Umverteilungsfunktion.
zB 150 -->1
151 -> 2
149 -->3

Je weiter du weg von 150 kommst, dest weiter nach unter gehst du im Array...
(Ist nur grad so ne überlegung)
 

Andi_CH

Top Contributor
Da fällt mir noch etwas auf - Quelle Telefonbuch?

Da hat also jemand das Telefonbuch eingelesen, die Namen sortiert, einmal abgespeichert und die Häufigkeit dazu geschrieben - und jetzt möchtest du diese Arbeit rückgängig machen ;-)

Seltsamer Ansatz!

Kannst du als Quelle nicht das Telefonbuch nehmen?
 

Stapf_JAVA

Mitglied
Da fällt mir noch etwas auf - Quelle Telefonbuch?

Da hat also jemand das Telefonbuch eingelesen, die Namen sortiert, einmal abgespeichert und die Häufigkeit dazu geschrieben - und jetzt möchtest du diese Arbeit rückgängig machen ;-)

Seltsamer Ansatz!

Kannst du als Quelle nicht das Telefonbuch nehmen?

Dieser jmd war leider nicht ich. Ich habe nur die Liste mit den Namen....also jeden Namen so oft speichern wie es dem Vorkommen entspricht schließe ich. z.B. Müller 300.000 Mal. (Man könnte noch mit dem Unwahrscheinlichsten kürzen aber der Wert wäre immer noch zu groß)
Die anderen Ansätze sind sich ja recht ähnlich. Da werde ich mal ansetzten. Ich danke allen...
 

Andi_CH

Top Contributor
Hm - nicht ganz fertig gedacht, aber könnte funktionieren

Alle Häufigkeiten zusammenzählen -> Total

Zufallszahl zwischen 0 und dem Total bestimmen

Wenn der Wert zwischen 0 - 300'000 liegt -> den ersten Namen wählen
Wenn er zwischen 300'001 und 300'000+Häufigkeit des zweiten Namens liegt -> den zweiten Name wählen

Realisiert so:

Zufallszahl bestimmen
Durch die Liste wandern und die Häufigkeiten aufsummieren
Sobald die Summe höher als die Zufallszahl ist: den letzten Name nehmen.
 

Final_Striker

Top Contributor
Ich hätte es wirklich gerne so, dass 0 am wahrscheinlichsten ist und 300(bzw der Maximalwert) am unwahrscheinlichsten.

Hast du zu jedem Namen einen Häufigkeitswert?

Also wenn du die Häufigkeiten hast dann kannst du sowas machen:

Anna 0.5
Lea 0.3
Marie 0.2

Generierung von Zufallszahlen von 1-10 weil 5+3+2 = 10

1 bis 5 wäre Anna
6 bis 8 wäre Lea
9 bis 10 wäre Marie

Damit hättest du nach 100 Versuchen ca. 50x Anna, 30x Lea und 20x Marie generiert.

Ich glaube so was, hast du dir doch vorgestellt oder?
 
Zuletzt bearbeitet:

Neue Themen


Oben