2017-05-21 3 views
3

Ich habe einen Prozentsatz, zum Beispiel 40%. Id möchte "einen Würfel werfen" und das Ergebnis basiert auf der Wahrscheinlichkeit. (Zum Beispiel gibt es 40% Chance wird es true sein).Generate wahr oder falsch boolean mit einer Wahrscheinlichkeit

+0

'Random random = new Random(); ... bool result = random.NextDouble() <= 0,40;' –

+0

ich eine Schmiede-System mit einer Wahrscheinlichkeit haben. Wenn ich klicke, um einen Gegenstand zu schmieden, besteht eine bestimmte Chance, dass der Gegenstand geschmiedet wird oder die Schmiede versagt. Das versuche ich zu tun. –

+0

Es gibt auch einen Stapelaustausch für Spieleentwickler. Viele Unity-Experten dort. Ich dachte nur, ich erwähne es. – stevenvanc

Antwort

3

Sie können so etwas wie dies versuchen:

public static bool NextBool(this Random random, double probability = 0.5) 
    { 
     if (random == null) 
     { 
      throw new ArgumentNullException(nameof(random)); 
     } 

     return random.NextDouble() <= probability; 
    } 
6

Seit Random.NextDouble() kehrt in [0..1) Bereich (Pseudo-) Zufallswert gleichmäßig verteilt, können Sie

// Simplest, but not thread safe 
private static Random random = new Random(); 

... 

double probability = 0.40; 

bool result = random.NextDouble() < probability; 
+0

Ich wünschte, ich könnte zweimal Upvote, einmal für die richtige Antwort und ein zweites Mal für die Verwendung der richtigen mathematischen Notation für ein Intervall. – EJoshuaS

+1

Super-Nitpick: Ich glaube '<' ist hier passender als '<=', da die Kantenfälle von 'Wahrscheinlichkeit = 0.0' und' Wahrscheinlichkeit = 1.0' in "nie" und "immer" übersetzt werden sollen. Mit '<=' gibt es eine von Null verschiedene Wahrscheinlichkeit, dass 'Ergebnis' wahr ist, wenn 'Wahrscheinlichkeit = 0.0' ist. –

+0

@Mark Dickinson: Dankeschön! Ich stimme Ihrem Gegenbeispiel zu: Normalerweise beinhaltet das Einschließen/Ausschließen von Punkten keine Rolle, da die Wahrscheinlichkeit des * genauen * Wertes * Null * ist. Wir haben jedoch keine * perfekte * gleichmäßige Verteilung mit 'random.NextDouble()' und 'probability = 0.0' ist ein Gegenbeispiel. Ich habe meine Antwort bearbeitet –

0

versuchen können Sie die eingebaute in Random.NextDouble() verwenden :

Gibt eine zufällige Gleitkommazahl zurück, die ist größer oder gleich 0,0 und weniger als 1,0

Dann können Sie testen, ob die Zahl größer ist als der Wert Wahrscheinlichkeit:

static Random random = new Random(); 

public static void Main() 
{ 
    // call the method 100 times and print its result... 
    for(var i = 1; i <= 100; i++) 
     Console.WriteLine("Test {0}: {1}", i, ForgeItem(0.4)); 
} 

public static bool ForgeItem(double probability) 
{ 
    var randomValue = random.NextDouble(); 
    return randomValue <= probability; 
} 

Nehmen Sie die Random Instanz gleichen beachten verwendet werden müssen. Here is the Fiddle example.

1

Einfache Unity Lösung:

bool result = Random.Range(0f, 1f) < probability; 
Verwandte Themen