如何在没有rand()函数的情况下生成随机数?

Ank*_*rVj 24 c random

我想生成0和某个整数之间的(伪)随机数.我不介意他们是不是太随意.我可以访问当天的当前时间,但不能访问rand功能.任何人都可以想到一种足够强大的方法来生成这些吗?也许,从一天中的某个时间丢弃一些比特并取模数我的整数或其他东西?

我正在使用c.

Rod*_*ddy 30

如果您使用的是超简单的伪随机生成器,则可以使用线性反馈移位寄存器.

维基百科文章有一些代码片段供您查看,但基本上16位生成器的代码看起来像这样(从该页面轻轻按摩......)

  unsigned short lfsr = 0xACE1u;
  unsigned bit;

  unsigned rand()
  {
    bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
    return lfsr =  (lfsr >> 1) | (bit << 15);
  }
Run Code Online (Sandbox Code Playgroud)


Den*_*nis 11

对于"不太随机"的整数,您可以从当前的UNIX时间开始,然后使用递归公式r = ((r * 7621) + 1) % 32768;.0(包括)和M(不包括)之间的第n个随机整数将r % M在第n次迭代之后.

这称为线性同余生成器.

递归公式是bzip2用于在其快速排序实现中选择枢轴的内容.我不知道其他目的,但它对这个特别的一个很好...


unw*_*ind 7

看看rand()你自己实现的伪随机生成器(什么是"内部" ),例如 Mersenne twister是备受推崇的.