RandomNumbersUsingC#RandomNumbersUsingC#我希望生成1到5百万之间的随机数。这个过程不一定要快(尽管它会很好),但它必须尽可能随机(我知道没有什么是随机的)。我有各种种子数据源。我不确定.NETRandom类是否足够好。这将用于选择中奖彩票。System.Random类可能已经足够好了:从有限的数字集中以相同的概率选择伪随机数。所选择的数字不是完全随机的,因为使用确定性数学算法来选择它们,但它们对于实际目的来说足够随机。Random类的当前实现基于DonaldE.Knuth的减法随机数生成器算法。有关详细信息,请参阅DEKnuth。“计算机编程艺术,第2卷:研究数学算法”。Addison-Wesley,Reading,MA,第2版,1981年。唯一需要注意的是不要经常重复使用相同的种子:如果重复使用相同的种子,就会生成相同的数字序列.产生不同序列的一种方法是依赖于时间的种子值,从而为每个新的Random实例产生不同的序列。如果需要加密随机数,请使用System.Security.Cryptography.RNGCryptoServiceProvider类或使用RandomNumberGenerator.Create()工厂方法来创建默认配置的随机数生成器。事实上,我最近读了一篇关于不同类型的PRNG的非常好的文章,以及它们如何在几种不同的随机性测试中执行。不幸的是,我现在似乎找不到它。然而,它的要点是,几乎所有流行的编程语言中的默认随机数生成器都非常幼稚,并且存在相当大的偏差。另一个答案已经提到,对于密码应用程序,无论算法多么复杂,都根本没有PRNG。这是真的。既然你提到这将用于“选择中奖彩票”,我们暂时忽略它。.NETSystem.Random类使用的Knuth算法主要针对速度而非随机分布进行了优化。出于许多目的,它是“随机的”并且大多数应用程序永远不会偏离太远,但在(a)游戏和(b)统计模拟的世界中,大多数人似乎认为这是一个糟糕的选择。它比旧库中默认使用的LCG更好,但您仍然不想将它用于乐透或其他东西。不要误以为您只使用加密源。加密RNG的问题在于它们填充字节流,但将其转换为x和y之间的单个随机整数需要您进行一些模运算(或舍入-两种方式的结果相同)。如果您的随机范围没有完全均匀地划分为由字节长度定义的2的幂,那么您最终会得到较低数字的偏差。生成的数据具有高熵,但您的结果会有偏差。举个简单的例子,假设你有一个从1到10的“完美”随机数,现在你想把它变成一个从1到7的随机数。你是怎么做到的?简单地计算结果%7将严重偏差数字1-3。使用加密RNG时有一些方法可以减少偏差,但我会说加密RNG是为加密应用程序设计的,使用它进行蒙特卡罗模拟通常不是最好的主意。据我所知,目前在游戏应用程序中使用的最流行的“好”PRNG是MersenneTwister。这里有一个.NET实现。该算法通过了所有Diehard随机分布测试;它几乎没有偏差,当您将随机数用于概率和统计应用程序时,它是一个不错的选择。GNU科学图书馆也有许多RNG算法,毫不奇怪,MersenneTwister是最重要的。尽管如此,还有一些值得好奇的人值得关注。RANLUX在DieHard测试IIRC中也取得了不错的成绩。当然,Eric的评论是正确的;如果您对随机数的“随机性”没有特定的技术要求,那么所有这些信息都是徒劳的。我使用的定义是针对影响相对较小的赌博/赌博应用程序(即不是每天有数百万访问者的主要注册赌博网站-对于这些网站的随机性有更严格的规定)。请参阅JonSkeet的博客文章RevisitingRandomness以获得关于如何使用Randomness的非常好的评论:RevisitingRandomness几乎每个包含单词“随机”和“重复”的StackOverflow问题都有相同的基本答案。这是.NET、Java以及其他平台中最常见的“问题”之一:在不指定种子的情况下创建新的随机数生成器将取决于当前时刻。与您创建和使用随机数生成器的频率相比,计算机测量的当前时间不会经常变化-因此重复创建Random的新实例并使用一次的代码最终会显示大量重复。更多...要生成随机数,请创建Random类的对象,然后使用该对象的Next函数生成随机数。它有许多重载,例如:Next(intminimum,intmaximum);下一个(最大整数);您可以在其中指定随机数之间的最小和最大范围。代码片段:Randomrandom=newRandom();int最大值=100;intr=random.Next(maxValue);System.Random类有很多错误,不符合要求。从理论上讲,它应该比许多其他伪随机生成器提供更好的结果。它是第2版“C中的数字食谱”第283页上提供的滞后斐波那契生成器(LFG)示例C代码的直接和文字端口(该代码在以后的版本中被重写)。LFG使用比许多其他库(例如Java)使用的线性同余生成器(LCG)更好的算法。不幸的是,Microsoft的System.Random类的实现有一个错误。有关详细信息,请参阅http://connect.microsoft.com/VisualStudio/feedback/details/634761/system-random-serious-bug。似乎有人在打算输入“31”时不小心输入了“21”。这破坏了算法的伪随机性质。该链接包含MS的解释,说明为什么他们认为此错误无法在此阶段修复。如果您正在寻找真正的随机数,那么您应该考虑使用使用自然现象的在线随机数生成器,例如使用大气噪声的http://www.random.org。真随机数也为伪随机数生成器提供了很好的种子。Sipwiz在他的回答:GeneratingRandomValuesinC#中展示了如何在C#中使用它。此处也对其进行了讨论:http://www.vcskicks.com/random-number-generator.php。随机数生成器有很多角度。一个有趣的替代实现是ISSAC(ttp://burtleburtle.net/bob/rand/isaac.html),它也包含对偏见等的很好的讨论,并且还有一个C#版本(http://burtleburtle.net)/bob/rand/isaacafa.html)。.NET中的随机数应该没问题:以上就是C#学习教程:使用C#随机数的全部内容分享。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——varrandom=newRandom(System.DateTime.Now.Millisecond);intrandomNumber=random.Next(1,5000000);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
