简体   繁体   中英

Getting specific random number

i want to generate random number between (1 to 6),is there any way to change the chance of geting number 6 more than other numbers?

for example for this code

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

Let p be probability of any 1..5 numbers and 1 - p is a probability of 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();
}

That wouldn't be random then. If you wanted to weight it so you would get 6 half the time, you could do this:

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

Based on what weighting you want you could change it-> 3 instead of 2 get a 33.33% weighting and so on. Otherwise, as the commenter said, you'd have to look into probability distributions for a more mathematically elegant solution.

Depends on how more likely. An easy way (but not very flexible) would be the following:

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();
}

If you want a totally random distribution of 1...5 and just a skwed 6, then Dmitry's seems best.

If you what to skew ALL the numbers, then try this:

  • Create a 100 element array.
  • Fill it with the number 1-6 in proportions based on how often you want the number to come up. (make 33 of them 6, if you want 6 to come up 1/3rd of the time. Four 4s means it'll only come up one in 25 rolls etc. 15 or 16 of each number will make it about evenly distributed, so adjust the counts from there)
  • Then pick a number from 0...99 and use the value in the element of the array.

You could define the possibility in a percentage of getting each of the numbers in an array:

/*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;
    }
}

Hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM