【问题标题】:Same random numbers in a for loopfor循环中的相同随机数
【发布时间】:2015-09-27 14:27:38
【问题描述】:

有很多类似的问题,但我找不到我的问题的答案。我正在编写自己的随机数生成器(用于学习目的)。我将代码的重要部分粘贴在这里:

long rng(long x0, long c, long p)
{
    long x = (c*x0) % p;
    return x;
}

main()函数中,我迭代这个rng()

long x2 = 37951;                    // initialize the seed
long c = 69069; long p = pow(2,32); // initialize c and p

for (int i=1; i<=n; i++) {
    long x1 = rng(x2,c,p);
    long x2 = rng(x1,c,p);
    cout << x1 << "\t" << x2 <<endl;
}

因为之后我想生成极坐标,我需要在每个循环中生成 2 个随机数。可以看到,种子只初始化了一次,但是我变成的结果是:

2621237619  504678423
2621237619  504678423
2621237619  504678423
2621237619  504678423
2621237619  504678423

如果我只生成 x2(使用 long x2 = rng(x1,c,p);),我会在每个循环中变成不同的结果。谁能告诉我为什么?

【问题讨论】:

  • 您将相同的值传递给无状态函数 - 您希望通过什么魔法得出不同的结果?
  • 请注意,在循环内部声明的long x2 与在外部声明的long x2 不同且无关。后者永远不会更新。
  • 将此行 long x2 = rng(x1,c,p); 修改为 x2 = rng(x1,c,p);,这样您就不会影响种子 long x2
  • 伪随机生成函数通常有一个种子,初始值由生成函数修改,新值用于下一次调用,再次修改种子下一个电话等等。您的生成函数实际上并没有这个种子值,也没有修改任何内容,因此如果您多次使用相同的参数调用该函数,它将再次创建相同的值。
  • 我认为没有理由使用pow(2, 32)

标签: c++ for-loop random


【解决方案1】:

这是因为用于计算x1x2没有更新,因为它被定义为局部变量。

试试这个:

#include <iostream>
#include <cmath>
using std::cout;
using std::endl;

long rng(long x0, long c, long p)
{
    long x = (c*x0) % p;
    return x;
}

int main(void) {
    long x2 = 37951;                    // initialize the seed
    long c = 69069; long p = pow(2,32); // initialize c and p
    int n = 5;

    for (int i=1; i<=n; i++) {
        long x1 = rng(x2,c,p);
        x2 = rng(x1,c,p);
        cout << x1 << "\t" << x2 <<endl;
    }
    return 0;
}

注意:如果long 的大小为 4 字节(32 位)或更少,则此代码将无法正常工作。

【讨论】:

    【解决方案2】:

    因为您一次又一次地为x1 传递相同的x2,它被声明为外部循环而不是内部,并且您将x1 传递给x2(本地到循环),但是由于您声明x2再次在这里,但是当每个循环结束时,这超出了范围。所以基本上你每次都通过x2 = 37951x1

    long x2 = 37951;                    // initialize the seed
    long c = 69069; long p = pow(2, 32); // initialize c and p
    
    for (int i = 1; i <= n; i++) {
        long x1 = rng(x2, c, p);
        //long x2 = rng(x1,c,p) will declaring new variable every time 
        //and this value will go out of scope when loop ends 
        x2 = rng(x1, c, p); // reusing same x2 again so that it will hold value for next time
        cout << x1 << "\t" << x2 << endl;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-28
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2018-09-08
      • 2012-03-04
      • 2020-08-05
      相关资源
      最近更新 更多