强大的随机数生成

我正在寻找一款性能卓越,功能强大的RNG,不需要特殊的硬件。它可以使用数学方法(Mersenne Twister等),它可以从机器“收集熵”,无论如何。在Linux / etc上,我们有一个 drand48(),它可以产生48个随机位。我想为C ++或C#提供一个类似的函数/类,它可以产生32位以上的随机性,而低阶位与高阶位一样随机。

它不必是加密安全的,但它不能使用或基于C语言 rand()或.NET System.Random

任何源代码,链接到源,等将不胜感激!否则,我应该寻找哪种类型的RNG?

0
额外 编辑
意见: 1
@ bames53我已经发布重新投票了。你似乎也有足够的代表,所以这样做。 :-D
额外 作者 Chris Jester-Young,
为什么不 System.Random ?我知道 rand 不好, System.Random 也不好?如果是这样,那很伤心:(
额外 作者 Mooing Duck,
关于这个问题的理由似乎并不正确。
额外 作者 bames53,
我想现在你可以简单的谷歌
额外 作者 Sergio,

9 答案

StackOverflow详细讨论了这个主题,除了乘法/加法/查找的相对成本之外,它相当独立于处理器和语言,这将使某些实现更具吸引力。

atan2()函数或矩形到极坐标转换不能通过合理大小的查找表完全实现; CORDIC 是一种选择。

3
额外

Have a look at the CORDIC algorithms in section 31.2 of the fxtbook: http://www.jjj.de/fxt/

2
额外

你在PIC上编码,你的角度有多少位?如果你有一个8位数字进来,查找表可以很容易,如果你有一个16位数字进来,那么这是一个不同的故事。

通常情况下,在PIC 8或10中,位数与您将获得的数量相当,查找表可能没有问题。人们经常迷失在获得高准确度的数字,通常你不需要一个。我有人读了一个12位数字的传感器,使用双打,并得到一个非常准确的转换。当他使用电压源作为测试输入时,它可以很好地工作,但是如果添加一个真实的传感器时发现错误,并且您发现所有的准确性都是浪费时间。

有些情况下我会建议使用高质量的sin/cos/tan函数,我从来没有在PIC上遇到过。请原谅我,如果您需要高质量的标志功能,我只是回答95%的情况下正确的答案。

1
额外
同意的Amos,我也喜欢你的解决方案,但乘法显示通常是基于硬件的存在而选择的,并非所有的PIC都具有硬件乘法器。实际上,您可以使用查找表来查找度数,并使用简单的线性逼近,并且如果它很重要,则永远不会知道差异。
额外 作者 Dan,
另外,如果您正在查看1度精度的角度,则表中只需要90个值。所有其他可以从第一象限的角度导出。如果你对正弦和余弦这样做,你可以从这些值得出正切值:tan(theta)= sin(theta)/ cos(theta)。你需要做arcsin,arccos和arctan吗?
额外 作者 svec,

有点晚,但这里是一个用于Trig函数的PicBasic Pro解决方案。它使用Cordic组件包含文件进行快速计算。给出Sin(x)和Cos(x)的结果,或者atan2(x,y)的结果,大约有16位精度。

http://www.picbasic.co.uk/forum/showthread.php ΔT= 10528

1
额外

对于C ++, Boost.Random 可能就是您要找的内容。它支持MT(在许多其他算法中),并且可以通过 nondet_random 类收集熵。一探究竟! :-)

0
额外

The Gnu Scientific Library (GSL) has a pretty extensive set of RN generators, test harness, etc. If you're on linux, it's probably already available on your system.

0
额外

C ++ 11采用了基于boost.random的强大的随机数字库。您可以使用不同算法访问多个随机数引擎,以满足您的质量,速度或尺寸要求。质量实现甚至可以通过 std :: random_device 提供对您的平台提供的任何非确定性RNG的访问。

此外,还有许多适配器可以生成特定的分布,无需手动进行这种操作(通常不正确)。

#include

0
额外

Boost.Random is my first choice for RNG

http://www.boost.org/doc/libs/random

0
额外
你可以找到随机通过只是谷歌搜索这就是为什么我dint提供任何链接。现在我已经通过lib链接更新了它。
额外 作者 Rohit Vipin Mathews,

留心Gnu科学图书馆。它获得GPL许可,而不是LGPL。

正如其他人提到的那样,Boost随机班是一个好的开始。它们的实现符合为TR1定义的PRNG代码:

http://www.boost.org/doc/libs/1_35_0/libs/random/index.html http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1452.html

如果您有最新版本的G ++编译器,则可能会发现TR1库已包含在内

0
额外