C# 随机事件

C# 随机事件,c#,random,probability,C#,Random,Probability,我不太清楚该怎么办 我需要生成14296个不同概率级别的随机数 例如,我需要一个包含数字18、1和17的数组。每个数字都有不同的发生概率百分比。因此: 55%=18 (7862.8倍) 30%=1 (4288.8倍) 15%=17 (2144.4倍) 结果类似于new Array(){18,18,1,17,1,18…}如果您总是将值作为整数百分比,我将根据概率用值填充100个元素的数组,因此在这种情况下,您的数组将有55次18,30次1,15次17。然后,您只需要从该数组中选取14296个随机值

我不太清楚该怎么办

我需要生成14296个不同概率级别的随机数

例如,我需要一个包含数字18、1和17的数组。每个数字都有不同的发生概率百分比。因此:

55%=18
(7862.8倍)

30%=1
(4288.8倍)

15%=17
(2144.4倍)


结果类似于new Array(){18,18,1,17,1,18…}

如果您总是将值作为整数百分比,我将根据概率用值填充100个元素的数组,因此在这种情况下,您的数组将有55次18,30次1,15次17。然后,您只需要从该数组中选取14296个随机值。(即,选择[0,100]范围内的整数并获取该元素。)


对于表示概率的不同方法,当然有不同的方法。但如果给定整数百分比,这是一个容易理解的选项。(另一种方法是按总概率对所有概率进行缩放,即在[0,1]的范围内),然后在该范围内随机抽取一个双精度。)

将随机生成器的范围划分为成比例的段,然后判断下一个随机数落入哪个段,从集合中选择相应的数字

类似于(简化的):

const int number[3]={1,17,18};
const int borders[2]={0.30*MAX_RANDOM,(0.30+0.15)*MAX_RANDOM};
int i=random.next(),num;
如果(i
当然,如果数字多于3,最好使用循环

注意:与Jon Skeet的解决方案不同,此解决方案可以提供高达1/(MAX_RANDOM+1)(在32位机器上通常高达2^32)的任何所需粒度,而不是严格的1%。

RANDOM r=new RANDOM();
Random r = new Random();

// for each number to generate
int nextNumber;
double probability = r.NextDouble();
if (probability < 55.0 / 100.0)
    nextNumber = 18;
else if (probability < (55.0 + 30.0) / 100.0)
    nextNumber = 1;
else
    nextNumber = 17;
//对于要生成的每个数字 int nextNumber; 双概率=r.NextDouble(); 如果(概率<55.0/100.0) nextNumber=18; 否则如果(概率<(55.0+30.0)/100.0) nextNumber=1; 其他的 nextNumber=17;
您可以在
列表中填入3个数字中每个数字的适当数字,然后。

类似的内容如何(未测试):

创建一个
列表
,并将其与值/百分比对(例如
n=18,p=55
)一起保存

然后只需执行以下操作即可选择一个数字:

List<np> npl = new List<np>();
// (fill the list here)



int r = rnd.next(total_of_all_p_values); // get random number
int res = 0; // result
for(int i = 0; i < npl.Length(); r -= npl[i++].n)
{
    if(r < npl[i].p) // remaining vlaue is smaller than current percentage
    {
        res = npl[i].n;
        break;
    }
}
List npl=new List();
//(在这里填写清单)
int r=rnd.next(所有值的总和);//获取随机数
int res=0;//结果
对于(int i=0;i
为了澄清,输入是1)一组数字,每个数字都有一个相关的期望概率,2)一个期望的输出数组大小?输入是正确的,输出是一个大小为N的数组,有N/a。概率元素的值为aSo很多好的答案,我不知道这次选择哪一个!你需要真正的随机性,还是“可预测的随机性”?以你的真实随机性为例,你可能会得到1%18,95%17,4%1。不确定这些类型的结果是否适合你。@Tom Fobear这里有一个非常深入的讨论,关于使用洗牌袋可以解决随机发生器随机性的问题。
struct np
{
    int n;
    int p;
}
List<np> npl = new List<np>();
// (fill the list here)



int r = rnd.next(total_of_all_p_values); // get random number
int res = 0; // result
for(int i = 0; i < npl.Length(); r -= npl[i++].n)
{
    if(r < npl[i].p) // remaining vlaue is smaller than current percentage
    {
        res = npl[i].n;
        break;
    }
}