C# 获取特定随机数

C# 获取特定随机数,c#,random,numbers,C#,Random,Numbers,我想生成一个介于(1到6)之间的随机数,有没有办法改变得到数字6的几率大于其他数字 例如,对于此代码 private void pictureBox5_MouseClick(object sender, MouseEventArgs e) { Random u = new Random(); m = u.Next(1,6); label2.Text = m.ToString(); } 这取决于可能性有多大。一个简单的方法(

我想生成一个介于(1到6)之间的随机数,有没有办法改变得到数字6的几率大于其他数字

例如,对于此代码

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

这取决于可能性有多大。一个简单的方法(但不是很灵活)是:

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

这取决于可能性有多大。一个简单的方法(但不是很灵活)是:

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

那不是随机的。如果你想称量它的重量,这样你就有一半的时间得到6,你可以这样做:

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

根据你想要的权重,你可以改变它->3而不是2,得到33.33%的权重,以此类推。否则,正如评论者所说,你必须研究概率分布,寻找一个数学上更优雅的解决方案。

那就不是随机的了。如果你想称量它的重量,这样你就有一半的时间得到6,你可以这样做:

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

根据你想要的权重,你可以改变它->3而不是2,得到33.33%的权重,以此类推。否则,正如评论者所说,你必须研究概率分布,以获得一个更精确的数学解。

p
是任何
1..5
数字的概率,
1-p
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();
}

p
为任何
1..5
数字的概率,
1-p
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();
}

如果你想要一个完全随机分布的1…5和一个skwed 6,那么Dmitry的似乎是最好的

如果您想知道如何扭曲所有数字,请尝试以下方法:

  • 创建一个100个元素的数组
  • 根据你希望数字出现的频率,按比例填入数字1-6。(如果你想让6占1/3的时间,就把其中的33个数字设为6。4个4意味着25卷中只会出现一个,等等。每个数字中的15或16个将使其大致均匀分布,因此从那里调整计数)
  • 然后从0…99中选择一个数字,并使用数组元素中的值

如果你想要一个完全随机的分布1…5和一个skwed 6,那么Dmitry的似乎是最好的

如果您想知道如何扭曲所有数字,请尝试以下方法:

  • 创建一个100个元素的数组
  • 根据你希望数字出现的频率,按比例填入数字1-6。(如果你想让6占1/3的时间,就把其中的33个数字设为6。4个4意味着25卷中只会出现一个,等等。每个数字中的15或16个将使其大致均匀分布,因此从那里调整计数)
  • 然后从0…99中选择一个数字,并使用数组元素中的值

您可以通过获取数组中每个数字的百分比来定义可能性:

/*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;
    }
}
/*静态(如适用)*/
数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学地板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6)};
////1到p.长度的概率数组
随机rnd=新随机();
////随机数发生器
int-nextPercentIndex=rnd.Next()%100//我记不起来是长度还是我头顶上的阵列数
////将随机数转换为0到100之间的数字
int TempPercent=0;
////用于比较百分比的临时容器
int returnVal=0;
////终值
for(int i=0;i!=p.Length;i++){
温度百分比+=p[i];
////将新百分比添加到临时百分比计数器

如果(nextPercentIndex,您可以通过获取数组中每个数字的百分比来定义可能性:

/*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;
    }
}
/*静态(如适用)*/
数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学地板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6),(双)数学天花板((双)100/6)};
////1到p.长度的概率数组
随机rnd=新随机();
////随机数发生器
int-nextPercentIndex=rnd.Next()%100;//我记不起它是长度还是数组的计数
////将随机数转换为0到100之间的数字
int TempPercent=0;
////用于比较百分比的临时容器
int returnVal=0;
////终值
for(int i=0;i!=p.Length;i++){
温度百分比+=p[i];
////将新百分比添加到临时百分比计数器

如果(nextPercentIndex)您应该查看搜索词:加权随机您应该查看搜索词:加权随机