C# 生成不包含某些数字的随机数

C# 生成不包含某些数字的随机数,c#,random,C#,Random,有没有办法从一组不包含某些数字的数字中生成一个随机数?例如,20-50之间的随机数不包括25,27,34。如果生成20-50之间的数字,然后丢弃不想要的数字,则会引入统计偏差。(您将倾向于增加结果分布的方差;特别是如果生成器是线性同余的) 最好的方法是在20-47范围内生成(调用图形xsay),然后使用 如果(x>=25)++x 如果(x>=27)++x 如果(x>=34)++xLINQ实施@Yeldar Kurmangaliyev注释: var allowed = Enumerable.Ran

有没有办法从一组不包含某些数字的数字中生成一个随机数?例如,20-50之间的随机数不包括25,27,34。

如果生成20-50之间的数字,然后丢弃不想要的数字,则会引入统计偏差。(您将倾向于增加结果分布的方差;特别是如果生成器是线性同余的)

最好的方法是在20-47范围内生成(调用图形
x
say),然后使用

如果(x>=25)++x
如果(x>=27)++x

如果(x>=34)++x

LINQ实施@Yeldar Kurmangaliyev注释:

var allowed = Enumerable.Range(20, 31).Except(new int[] { 25, 27, 34 });

Random rand = new Random();

int randomNum = allowed.ElementAt(rand.Next(0, allowed.Count()));

你能展示最小但完整的程序来演示你的问题吗?1)生成一个“允许”项数组。2) 随机挑选一个项目。在我看来,如果“不允许”项太少,这个算法比上一个算法更差,但如果“不允许”项太多,这个算法会更好。@YeldarKurmangaliyev:从统计学角度看,你的想法很好。作为答案,我会投赞成票。我不明白这将如何避免数字25、27和34。好的,现在知道了。不知道为什么这会比丢弃和再生更好。理论相当深刻。但总的来说,在任意遗漏数字时,您会更改生成器已经补偿的自相关特性。其效果是增加样本方差并扰动更高的矩。运行一些分析以查看效果。对这样的样本进行卡方检验,将数字转换回连续的。有趣的。这对真随机数也是真的还是只对PRNG是真的?这对真随机数生成器不是真的,因为它们是马尔可夫的。只给伪的。谢谢你,你的方法很有用。这种方法会比其他方法更偏爱某些数字吗?@avisikirov-不,每个数字都有完全相同的概率