-2 c++ random algorithm function
我正在尝试制作我自己的随机数生成器,并且很惊讶通过做这样的事情生成随机数是多么容易.
#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);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是多么有效,我的意思是,它似乎产生相当随机的数字,但是弄清楚下一个数字是多么容易?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
关于
"弄清楚下一个数字是多么容易
我认为对于伪随机数生成器来说这不是一个正确的问题,但是,它仍然很容易.
给定两个连续的伪随机数A和B,计算(A << 1)^ B得到X = 熵 + 4*i.现在,你可以计算(乙 << 1)^(X + 4),这就是你的下一个伪随机数Ç.
我记得在Donald Knuth的"计算机编程艺术"第1卷中讨论了pseduo-random数字生成器.
该讨论包括考虑统计的善良措施.