蹩脚的随机数发生器(Crappy Random Number Generator)

2019-08-17 11:59发布

这听起来像一个奇怪的问题,但我在哪里可以找到一个随机数发生器,在C或C ++的作品,是不是很好?

背景:我创建了一些树图绘制软件,通过使用多位数的随机数测试它(因此每个数字变成了树中的节点)。 这是自带的GNU C ++编译器的一个 - - 我一直在使用随机数生成器给我值的很好的传播。 这是很好的,但我想看看表的外观,当数字聚集在一起,而且不太均匀。

任何人都可以表明,已被证明是不那么随机的随机数发生器?

(呵呵,谁链接的任何人到XKCD和/或建议我只返回4将得到讽刺响应)。

Answer 1:

我一直认为RANDU坏随机数生成器的教父。



Answer 2:

实现一个相当短的线性反馈移位寄存器由C.使用位操作

大多数的LFSR上公布的材料将集中在最大序列,但它听起来像是你可以破坏其中之一,以产生更短的序列,用一个小实验。



Answer 3:

该Boost库提供的功能来生成分布在各种非均匀分布,包括正态分布这可能会产生有趣的形状的树木随机值。



Answer 4:

C标准建议:

static unsigned long int next = 1;

int rand(void) // RAND_MAX assumed to be 32767
{
    next = next * 1103515245 + 12345;
    return (unsigned int)(next/65536) % 32768;
}

void srand(unsigned int seed)
{
    next = seed;
}

举一个简单的线性同余发生器(LCG),这是不坏(有很多糟糕的台,你可以使用常量),但它肯定不是一个很好的伪随机数生成器相比,加密宇宙的其他成员和近的加密伪随机数生成器。 这可能足以对你不好,或者您也可以咨询克努特第2卷,以寻找其他的坏组数字。 (塞奇威克的我(旧)副本具有与坏常数的一些插图随机数相当短的第35章)。



Answer 5:

其中,同时继续使用gcc可以引入集群的方法是随机取两个返回的随机数作为迭代的随机数的上下界括号。 这样做几次,你应该得到随机集群。



Answer 6:

A C ++溶液:

class ClumpedRandom
{
  public:
    ClumpedRandom(int maxClumpSize) 
     : mMaxClump(maxClumpSize)
     , mCurrentClumpSize(0)
     , mCurrentCount(0)
    {
       if (!sInitialized) {
         sInitialized = true;
         srand(time(NULL));
       } 
    }

    int operator()()
    {
      if (++mCurrentCount >= mCurrentClumpSize) {
        // Need a new clump:
        mCurrentClumpSize = rand() % mMaxClump;
        mCurrentCount = 0;
        mCurrentValue = rand();
      }

      return mCurrentValue;   
    }


  private:
    static bool sInitialized;
    int mMaxClump;
    int mCurrentClumpSize;
    int mCurrentCount;
    int mCurrentValue;
};

它产生的随机长度奔跑在相同的随机数的值的最maxClumpSize实例。 (我没有说的很清楚...希望你的想法)。



Answer 7:

该数值方法在C第7章本书涉及的各种随机数发生器。 7.7节涵盖准(即子)随机序列。



Answer 8:

使用随机数发生器( 维基百科PRNG页 ),有约束。

其他一些可能性: UChicago , 密西根大学 , FSU



Answer 9:

用函数srand,但增加了一个种子就其犯规太大变化。 事实上,所有的伪随机数发生器行为这种方式。

基本上,只要用1种子,然后再2 3 ..很快你会看到“随机”的数字并没有那么乱。



Answer 10:

实际上,rand()函数是真的很糟糕。 我用GameRand这是非常简单的,并产生像样的成绩,但对你来说可能仍然不够糟糕。



Answer 11:

往往是蹩脚randomish看的号码,我通常需要确定的,我计算正弦和简单表达式的余弦大十岁上下的价值观和相位调制。 通常我产生在两个维度上颜色图形目的(“程序纹理”和所有的),所以我给像在一般的伪代码的例子:

for i=1,N
  for j=1,N
    value[i*n+j] = sin(51*i*i+cos(80*j)) + sin(300*j+3*sin(111*i-j))

注定要失败的随机性最严重的考验。 其结果是在一个方式,是对艺术很有用蹩脚。

这是有趣的坐下来,在交互式绘图环境像Matlab或Python与numpy的和matplotlib用这样的公式发挥。



文章来源: Crappy Random Number Generator