2016-03-29 8 views
-2

Ich möchte einige Zahlen jedes Mal basierend auf einer Wahrscheinlichkeit erstellen.Erstellen Sie Zahlen mit Grenzen basierend auf einer Wahrscheinlichkeit pro Nummer

Beispiel:

Numbers from: 1-5

Number 1 Wahrscheinlichkeit von 0,55 werden geschaffen,

Nummer 2 hat Wahrscheinlichkeit von 0,25 craeted werden,

Nummer 3 hat eine Wahrscheinlichkeit von 0.10,

craeted. Nummer 4 hat eine Wahrscheinlichkeit, dass sie craeted von 0,05,

Nummer 5 hat Wahrscheinlichkeit von 0,05

In diesem Fall craeted wird, hat es in der Regel Nummer erstellen 1, und oft die Nummer 2, manchmal Nummer 3 und selten 4 oder 5

Also, die "Methode": create_the_numbers(int ending_number) wie dieser pseado-Code sein sollte:

public int create_the_numbers(int ending_number){ 
return probability(Random.getInt(ending_number)) 
} 

Es ist eine Frage für die C# hier: Probability Random Number Generator

+0

Können Sie den ersten Satz in Ihrer Frage umformulieren? Es ist ziemlich schwer zu verstehen, wonach Sie suchen. – sprinter

+0

Gesamtwahrscheinlichkeit ist '1,4'. Es sollte '1.0' (oder' 100% ') sein, sonst sprichst du über Gewichtungsfaktoren, nicht über Wahrscheinlichkeiten. – Andreas

+0

Ich denke, dass mein Beispiel klar ist. aber ich werde meine Q – user6126842

Antwort

0

Ich glaube, Sie fragen, wie Sie Wahrscheinlichkeiten gewichten. Eine einfache Methode ist wie folgt:

int getWeightedRandomInt(double... weights) { 
    final Random random = new Random(); 
    double val = random.nextDouble(); 
    for (int i = 0; i < weights.length; i++) { 
     if (val < weights[i]) 
      return i; 
    } 
    throw new IllegalArgumentException("badly formed weights"); 
} 

Dies wird verwendet, indem sortierte kumulative Gewichte übergeben. In Ihrem Beispiel:

getWeightedRandomInt(0.55, 0.8, 0.9, 0.95, 1.0); 

Wenn Sie mit Java 8:

Arrays.stream(weights).filter(w -> val < w) 
    .findFirst().orElseThrow(IllegalArgumentException::new); 
+0

Die Variable 'random' ist null, also NPE. --- Es sollte '<', nicht '<=', für eine korrekte Verteilung sein. – Andreas

0

Die folgende Methode wird es tun:

private static int get() { 
    double d = Math.random(); 
    if (d < 0.55) return 1; // 0.55 
    if (d < 0.80) return 2; // 0.25 
    if (d < 0.90) return 3; // 0.10 
    if (d < 0.95) return 4; // 0.05 
    return 5;    // 0.05 
} 

Mit Math.random() einfach ist, aber es Grenzen hat. Lies das Javadoc. Alternativ verwenden Sie Random.

Verwandte Themen