这个非常短的随机数发生器有多安全/有效?

-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)

我的问题是,这是多么有效,我的意思是,它似乎产生相当随机的数字,但是弄清楚下一个数字是多么容易?

Che*_*Alf 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

关于

"弄清楚下一个数字是多么容易

我认为对于伪随机数生成器来说这不是一个正确的问题,但是,它仍然很容易.

给定两个连续的伪随机数AB,计算(A << 1)^ B得到X = + 4*i.现在,你可以计算( << 1)^(X + 4),这就是你的下一个伪随机数Ç.


我记得在Donald Knuth的"计算机编程艺术"第1卷中讨论了pseduo-random数字生成器.

该讨论包括考虑统计的善良措施.