2017-05-26 1 views
1

Ich möchte Zufallszahl zwischen (1 bis 6) generieren, gibt es eine Möglichkeit, die Chance auf Nummer 6 mehr als andere Zahlen zu ändern?Bestimmte spezifische Zufallszahl erhalten

zum Beispiel für diesen Code

private void pictureBox5_MouseClick(object sender, MouseEventArgs e) 
    { 
     Random u = new Random(); 
     m = u.Next(1,6); 
     label2.Text = m.ToString(); 
    } 
+1

Sie sollten sich [Wahrscheinlichkeitsverteilungen] (https://en.wikipedia.org/wiki/List_of_probability_distributions) ansehen – litelite

+1

Suchbegriff: Weighted random –

Antwort

2

Let p Wahrscheinlichkeit irgendwelcher 1..5 Zahlen und 1 - p ist eine Wahrscheinlichkeit von 6:

//DONE: do not recreate Random 
private static Random s_Generator = new Random(); 

private void pictureBox5_MouseClick(object sender, MouseEventArgs e) { 
    const double p = 0.1; // each 1..5 has 0.1 probability, 6 - 0.5 

    // we have ranges [0..p); [p..2p); [2p..3p); [3p..4p); [4p..5p); [5p..1) 
    // all numbers 1..5 are equal, but the last one (6) 
    int value = (int) (s_Generator.NexDouble()/p) + 1; 

    if (value > 6) 
    value = 6;   

    label2.Text = value.ToString(); 
} 
0

Hängt davon ab, wie wahrscheinlicher. Ein einfacher Weg (aber nicht sehr flexibel) wäre der folgende:

private void pictureBox5_MouseClick(object sender, MouseEventArgs e) 
{ 
    Random u = new Random(); 
    m = u.Next(1,7); 
    if (m > 6) m = 6; 
    label2.Text = m.ToString(); 
} 
1

Das wäre dann nicht zufällig. Wenn Sie wollte es gewichten, so dass Sie 6 die Hälfte der Zeit bekommen würde, könnten Sie dies tun:

m = u.Next(1,2); 
if(m == 2) 
{ 
label2.Text = "6"; 
} 
else 
{ 
label2.Text = u.Next(1,5).ToString(); 
} 

Basierend auf welcher Gewichtung wollen Sie Sie it-> 3 statt 2 erhalten eine 33,33% Gewichtung ändern könnte und so auf. Andernfalls müssten Sie, wie der Kommentator sagte, in Wahrscheinlichkeitsverteilungen nach einer mathematisch eleganteren Lösung suchen.

0

Wenn Sie eine völlig zufällige Verteilung von 1 ... 5 und nur skwed 6 wollen, dann Dmitry scheint am besten .

Wenn Sie, was alle Zahlen zu verdrehen, dann ist diese versuchen:

  • ein Array 100 Element erstellen.
  • Füllen Sie es mit der Zahl 1-6 in Proportionen basierend darauf, wie oft Sie wollen, dass die Nummer hochkommt. (Machen Sie 33 von ihnen 6, wenn Sie wollen 6 zu 1/3 der Zeit kommen. Vier 4s bedeutet, dass es nur eine in 25 Rollen etc. 15 oder 16 von jeder Zahl wird es etwa gleichmäßig verteilt, so Passen Sie die Anzahl von dort an)
  • Wählen Sie dann eine Zahl von 0 ... 99 und verwenden Sie den Wert im Element des Arrays.
0

Sie könnten die Möglichkeit, in einem Prozentsatz von jedem der Zahlen immer in einem Array definieren:

/*static if applicable*/ 
int[] p = { (int)Math.Ceiling((double)100/6), (int)Math.Floor((double)100/6), (int)Math.Ceiling((double)100/6), (int)Math.Floor((double)100/6), (int)Math.Ceiling((double)100/6), (int)Math.Ceiling((double)100/6) }; 
////The array of probabilities for 1 through p.Length 
Random rnd = new Random(); 
////The random number generator 
int nextPercentIndex = rnd.Next() % 100; //I can't remember if it's length or count for arrays off the top of my head 
////Convert the random number into a number between 0 and 100 
int TempPercent = 0; 
////A temporary container for comparisons between the percents 
int returnVal = 0; 
////The final value 
for(int i = 0; i!= p.Length; i++){ 
    TempPercent += p[i]; 
    ////Add the new percent to the temporary percent counter 
    if(nextPercentIndex <= TempPercent){ 
     returnVal = i + 1; 
     ////And... Here is your value 
     break; 
    } 
} 

Hoffnung, das hilft.