C#如何根据概率生成随机数
C# How to Generate Random Number Depends on Probabilities
我有一种情况,我必须生成一个随机数,这个数字必须是 zero
或 one
所以,代码是这样的:
randomNumber = new Random().Next(0,1)
但是,业务需求声明生成的数字为零的概率仅为 10%,生成的数字为 1 的概率为 90%
但是我可以在生成随机数时包含该概率吗?
我想到的是:
- 生成包含 10 个零和 90 个一的整数数组。
- 生成 1 到 100 之间的随机索引
- 取对应于该索引的值
但是我不知道这种方式是否正确,另外,我认为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;
我有一种情况,我必须生成一个随机数,这个数字必须是 zero
或 one
所以,代码是这样的:
randomNumber = new Random().Next(0,1)
但是,业务需求声明生成的数字为零的概率仅为 10%,生成的数字为 1 的概率为 90%
但是我可以在生成随机数时包含该概率吗?
我想到的是:
- 生成包含 10 个零和 90 个一的整数数组。
- 生成 1 到 100 之间的随机索引
- 取对应于该索引的值
但是我不知道这种方式是否正确,另外,我认为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;