2012-04-12 10 views
1

erzeugen kann, versuche ich, eine Zufallszahl innerhalb eines Bereichs von -1 bis 6 zu generieren, aber für jedes Mal, wenn ich eine Zufallszahl erzeuge, die Wahrscheinlichkeit von eine Zahl in dem Bereich erhalten wird durch einen Prozentsatz angegeben. Zum Beispiel hat in einer Liste von Prozentsätzen der erste Prozentsatz die Wahrscheinlichkeit, eine 6 zu erzeugen, der zweite Prozentsatz hat die Wahrscheinlichkeit, eine 5 zu erzeugen, und so weiter. Die Zahlen müssen zufällig generiert werden. Ich versuche das in C zu codieren. Danke für Ihre Ideen.Wie ich eine Zufallszahl innerhalb eines Bereichs mit der Wahrscheinlichkeit einer der Zahlen

+0

Zu den VTC-ers. Dies ist tatsächlich eine ziemlich gewöhnliche Sache (das Gegenteil von zu lokalisiert), obwohl es in einer etwas verschlungenen Weise beschrieben wird. – bitmask

Antwort

4

Sie könnten eine Zufallszahl zwischen 0 und 100 erhalten und prüfen, in welchen Prozentbereich dieser fällt, und ihm den entsprechenden Wert zuweisen.

Zum Beispiel:

0 - 5 : -1 
    5 - 25 : 0 
    25 - 31: 1 
    31 - 48: 2 
    48 - 50: 3 
    50 - 75: 4 
    75 - 87: 5 
    87 - 100: 6 

EDIT:

Um dies zu implementieren, Sie würden ein oder zwei Arrays benötigen, eine, die die Prozentgrenzen speichert (was bedeutet, 5, 25, 31, 48, 50 , 75, 87 in diesem Fall) und ein anderes Array, das die Ausgabewerte speichert (wenn die Ausgaben völlig zufällig sind, hier wo sie sequentiell sind, würden Sie kein zweites Array benötigen).
Dann erhalten Sie rand() * 100.0/RAND_MAX rufen einen zufälligen Schwimmer zwischen 0 und 100 oder rand() % 100 + 1 für eine zufällige int zwischen 0 und 100.

Damit erhalten Sie eine binäre Suchmethode verwenden können, um herauszufinden, welchen Prozentbereich dies in O entspricht (log n) Zeit. Mit dem Index finden Sie den entsprechenden Ausgang (entweder über ein Array oder eine Funktion)

+0

Ich tat tatsächlich so etwas, aber ich lehrte, ich tat es falsch..aber danke für die Klärung für mich – user1319817

0

Ich bin sicher, es gibt andere, wahrscheinlich bessere Möglichkeiten, dies zu tun, aber was mir in den Sinn kommt ist: Erstellen Sie ein Array mit entsprechenden Kopien von jeder Zahl (-1 bis 6) nach Ihren Prozentsätzen. Wählen Sie dann zufällig ein Element im Array.

+0

Das funktioniert, wenn die Prozentsätze Ganzzahlen sind, für Prozentsätze wie 0,5% würde dies nicht funktionieren – SirGuy

1

Ist das eine Hausaufgabe? Ich gehe nicht davon aus, um der Menschheit zu vertrauen;)

Also meine ich, alle Ihre Prozentsätze sollten bis zu 100 ergeben, oder? Sie könnten eine Zahl zwischen 0 und 100 generieren und sehen, in welche Klammer es fällt.

dh Wenn der Prozentsätze sind [10,20,35,15,10,10]

Dann wird die erste Halterung ist "< 10" so erzeugt jede Zahl unter 10 a 6

x < 10 --> 6 
10 <= x < (10+20) --> 5 
(10+20) <= x < (10+20+35) --> 4 
(10+20+35) <= x < (10+20+35+15) --> 3 
yeilds

usw. Sie möchten einen zufälligen Gleitkommawert zwischen 1 und 100 erzeugen, um beispielsweise Präzedenzprozentwerte wie 11,9 zu erfüllen.

+0

nein, es ist keine Hausaufgaben Zuordnung;) Ich habe gerade versucht, ein einfaches textbasiertes Spiel zu machen. Danke für die Eingabe :) – user1319817

0

Ich denke, der einfachste Weg, dies zu tun, ist die folgende Analogie zu berücksichtigen:

Wenn Sie eine Linie [0,1] haben, können Sie denken, dass gleichwertige eine Zahl von 1 bis 4 ist das Erzeugen des aufzuspalten Linie in 4 Segmenten, S_1 = [0,1/4], S_2 = [1/4,2/4], S_3 = [2/4,3/4], S_4 = [3/4,1]. Wenn Sie also eine Zahl aus [0,1] erzeugen, fällt die generierte Zahl auf i, wenn sie auf das Segment S_i fällt.

Wenn Sie jeder Zahl verschiedene Wahrscheinlichkeiten zuweisen möchten, sagen wir p_i, müssen Sie das Segment nur in verschiedene Größen aufteilen, entsprechend p_i.

Zum Beispiel für 1 mit p_1 = 0,1, 2 mit p_2 = 0,4, 3 mit p_3 = 0,2 und 4 mit p_4 = 0.3 können Sie die Segmente S_1 = [0, p_1], S_2 = [p_1, p_1 + p_2], S_3 = [p_1 + p_2, p_1 + p_2 + p_3] und S_4 = [p_1 + p_2 + p_3, p_1 + p_2 verwenden + p_3 + p_4]

Dann generieren Sie eine einheitliche Zufallszahl auf [0,1], und testen, ob es in S_i fiel.

+0

Du hast einen guten Punkt. Das ist meiner Lösung sehr ähnlich, aber die Reichweite könnte eigentlich von jedem Bereich, den Sie verwenden möchten, angenommen werden, solange die Verhältnisse stimmen. Einstellungsbereiche zwischen 0 und 1 sind nett, wenn Ihre Prozentsätze und der Zufallszahlengenerator bereits in diesem Bereich liegen. – mltsy

1

Machen Sie ein Array mit 100 Elementen, füllen Sie es mit -1 bis 6, hängt davon ab, wie viel Gewicht jedes benötigt. Wenn Sie beispielsweise -1 benötigen, um 15% Treffer zu erzielen, füllen Sie 15 Elemente mit -1. jetzt eine Zufallszahl von 1 bis 100 generieren, und einfach das Array nachschlagen, erhalten Sie die tatsächlichen Ergebnisse gewichtet.

+0

das funktioniert nicht für Dezimal Prozentsätze, wie 0,5% – SirGuy

+0

, da er ein Text-Basis-Spiel macht, ich denke, ganzzahlige Prozentsätze ausreichen, sofern er nicht anders sagt. Dies sollte auch eine gute Leistung für den Hochfrequenzgebrauch ergeben. – pizza

+0

Einverstanden, ich meine nicht, dass deine Methode ungültig ist, nur dass es einen Vorbehalt gibt – SirGuy

Verwandte Themen