我正在尝试制作我自己的随机数生成器,并且很惊讶通过做这样的事情来生成随机数是多么容易。
#include <iostream>
using namespace std;
int main(){
unsigned int number = 1;
for ( unsigned int i = 0; i < 0xFFFF ; i++ ){
unsigned int * data[0xFFFF];
number = number << 1;
number = number ^ (unsigned int)&data[i];
}
cout << number << endl;
while (1);
}
我的问题是,这是多么有效,我的意思是,它似乎产生相当随机的数字,但是弄清楚下一个数字是多么容易?
答案 0 :(得分:5)
data
项的地址(实际上,因为它们在每次迭代中都是相同的)单调递增。它们被用作一次性熵源。由于它们单调增加,它们不是一个非常好的熵源。
实际上,对于32位代码,您的代码等同于:
auto main() -> int
{
unsigned number = 1;
unsigned const entropy = 123456; // Whatever.
for ( unsigned i = 0; i < 0xFFFF ; ++i )
{
number = number << 1;
number = number ^ (entropy + 4*i);
}
}
关于
“弄清楚下一个数字是多么容易
我认为对于伪随机数生成器来说这不是一个正确的问题,但是,它仍然很容易。
给定两个连续的伪随机数 A 和 B ,计算( A <&lt;&lt; 1)^ B < / i>产生 X = 熵 + 4 * i 。现在你可以计算( B &lt;&lt; 1)^( X + 4),那就是你的下一个伪随机数 C
我记得在Donald Knuth的计算机编程艺术的第1卷中讨论了pseduo-random数字生成器。
该讨论包括对善的统计测量的考虑。
答案 1 :(得分:0)
这根本不是随意的。甚至不是假的,
没有状态,所有输入位都被丢弃
基本上你是从堆栈中拉出一些垃圾并稍微操纵它
在许多情况下,它总会给出相同的结果。