C#如何根据概率生成随机数

C# How to Generate Random Number Depends on Probabilities

我有一种情况,我必须生成一个随机数,这个数字必须是 zeroone

所以,代码是这样的:

randomNumber = new Random().Next(0,1)

但是,业务需求声明生成的数字为零的概率仅为 10%,生成的数字为 1 的概率为 90%

但是我可以在生成随机数时包含该概率吗?

我想到的是:

  1. 生成包含 10 个零和 90 个一的整数数组。
  2. 生成 1 到 100 之间的随机索引
  3. 取对应于该索引的值

但是我不知道这种方式是否正确,另外,我认为C#应该已经准备好了

以 10% 的概率为真:

bool result = new Random().Next(1, 11) % 10 == 0;

以 40% 的概率为真:

bool result = new Random().Next(1, 11) > 6;

首先,您应该保存对随机实例的引用,以便获得正确的随机数序列:

Random randGen = new Random();

第二个要知道的是,随机数的最大值是互斥的,所以要正确解决这个问题你应该这样做:

int eitherOneOrZero = randGen.Next(1, 11) % 10;

要将其推广到任何机会变化,您可以:

Random randGen = new Random();
var trueChance = 60;

int x = randGen.Next(0, 100) < trueChance ? 1 : 0;

测试:

Random randGen = new Random();
var trueChance = 60;

var totalCount = 1000;
var trueCount = 0;
var falseCount = 0;

for (int i = 0; i < totalCount; i++)
{
    int x = randGen.Next(0, 100) < trueChance ? 1 : 0;

    if (x == 1)
    {
        trueCount++;
    }
    else
    {
        falseCount++;
    }
}

输出:

True: 60.30 %

False: 39.70 %

你可以这样实现它:

  // Do not re-create Random! Create it once only
  // The simplest implementation - not thread-save
  private static Random s_Generator = new Random();

  ...
  // you can easiliy update the margin if you want, say, 91.234%
  const double margin = 90.0 / 100.0; 

  int result = s_Generator.NextDouble() <= margin ? 1 : 0;