首页 > 解决方案 > 为什么 C++11 随机生成器使用引用或非引用参数有不同的列表?

问题描述

谁能解释为什么函数foo1返回相同的值?

#include<iostream>
#include<random>
#include<ctime>

using namespace std;

int foo(default_random_engine& random, uniform_int_distribution<unsigned int>& dis1){
    return dis1(random);
}

int foo1(default_random_engine random, uniform_int_distribution<unsigned int> dis1){
    return dis1(random);
}

int main()
{
    default_random_engine engine(static_cast<unsigned int>(time(0)));
    uniform_int_distribution<unsigned int> randomInt(1, 10);

    cout << "Way1:\n";
    for(int i = 0; i < 10; ++i)
        cout<<foo(engine, randomInt)<<' ';
    cout<<endl;
    cout << "Way2:\n";
    for(int i = 0; i < 10; ++i)
        cout<<foo1(engine, randomInt)<<' ';
    cout<<endl;
    return 0;
}

结果是:

方式 1:
9 2 5 5 7 7 9 9 6 6
方式 2:
7 7 7 7 7 7 7 7 7 7

标签: c++randomreference

解决方案


foo1()通过 value获取其参数,因此每次调用时都会制作它们的副本。foo1()它在每次调用时生成相同的数字,因为它每次都使用相同的生成器状态(即相同的种子),对副本所做的任何更新都不会反映回调用者的原始对象。

情况并非如此,它通过引用foo()获取其参数,因此被引用的调用者的对象可以通过 更新。foo()


推荐阅读