【问题标题】:How secure/effective is this very short random number generator? [closed]这个非常短的随机数生成器有多安全/有效? [关闭]
【发布时间】:2015-02-19 01:58:52
【问题描述】:

我正在尝试制作自己的随机数生成器,并惊讶于通过执行这样的操作来生成随机数是多么容易。

#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);
}

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

【问题讨论】:

  • 如所写,您的程序仅输出一个数字。 cout &lt;&lt; number &lt;&lt; endl 行是否应该在循环内?
  • 我认为应该发到Code Review

标签: c++ algorithm function random


【解决方案1】:

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

关于

找出下一个数字是多么容易

在我看来,对于伪随机数生成器来说,这不是一个完全正确的问题,但它仍然非常简单。

给定两个连续的伪随机数 AB,计算 (A B 产生 X = + 4*i。现在您可以计算 (B X + 4),这就是您的下一个伪随机数 C


我记得在 Donald Knuth 的计算机编程艺术的第 1 卷中讨论了伪随机数生成器。

该讨论包括考虑善度的统计测量。

【讨论】:

    【解决方案2】:

    这根本不是随机的。甚至不是伪的,

    它没有状态,所有输入位都被丢弃

    基本上你是从堆栈中取出一些垃圾并进行一些操作

    在许多情况下,它总是会给出相同的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2016-06-23
      相关资源
      最近更新 更多