循环的C ++随机数生成器

时间:2013-10-07 18:54:37

标签: c++ random

所以,我在这里有一个小问题,有一个相当大的for循环。这个程序是为了模拟每个步骤100步 - 我想要做的是让程序执行100万次这些随机游走模拟(随机游走是通过嵌套for循环完成的,主要是通过模拟硬币的翻转,如您可以在下面的代码中看到)并从每个随机游走中获取结果位移,并将它们打印到控制台窗口和指定的输出文件。

但是,我的代码似乎是从嵌套的for循环中添加x的每个最终值,然后将它们打印到控制台窗口(并保存到输出文件) - 我不想要这个,我只想要独立的网络每个随机游走的结果为j的每个值输出(其范围从1到1E6,由外部for循环指定)。

因此,任何帮助将不胜感激。另外,我非常感谢你不仅仅引用一些代码供我使用,而是向我解释我的程序逻辑出错的地方以及原因。

先谢谢,我的代码在下面!

#include <iostream>
#include <ctime>
#include <fstream>

using namespace std;

int main(void) {

    const unsigned IM = 1664525;
    const unsigned IC = 1013904223;

    const double zscale = 1.0/0xFFFFFFFF;      //Scaling factor for random double between 0 and 1
    unsigned iran = time(0);                        //Seeds the random-number generator from the system time
    const int nsteps(100);                          //Number of steps
    const int nwalks(1E6);

    int x(0);           // Variable to count step forward/back

    ofstream randout;
    randout.open("randomwalkdata2.txt");

    // Table headers for console window and output file

    cout << "Random Walk Number \t Resultant Displacement \n";
    randout << "Random Walk Number \t Resultant Displacement \n";

    for ( int j = 1 ; j <= nwalks ; j++ ) {

        for ( int i = 1 ; i <= nsteps ; i++ ) {

            // if-else statement to increment/decrement x based on RNG

            if ( zscale * double( iran = IM * iran + IC ) < 0.5 )   //RNG algorithm
                x++;
            else 
                x--;

        }

        cout << j << "\t" << x << endl;
        randout << j << "\t" << x << endl;

    }

    randout.close();

    return 1;

}

1 个答案:

答案 0 :(得分:5)

在每次随机游走后你忘了重新初始化x。

    cout << j << "\t" << x << endl;
    randout << j << "\t" << x << endl;
    x=0;

应该做的伎俩。