c++ - 为什么 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
解决方案
foo1()
通过 value获取其参数,因此每次调用时都会制作它们的副本。foo1()
它在每次调用时生成相同的数字,因为它每次都使用相同的生成器状态(即相同的种子),对副本所做的任何更新都不会反映回调用者的原始对象。
情况并非如此,它通过引用foo()
获取其参数,因此被引用的调用者的对象可以通过 更新。foo()
推荐阅读
- javascript - 每次加载时按内容设置 iframe 高度
- c# - 使用接口继承进行强制转换
- angular - Angular 7 - 如何在某些响应状态代码上重试 http 请求?
- sql - 在 SQL Postgres 中迭代 group by
- c# - 我可以在普通 VM 上部署我的 Azure 功能吗?
- python - Keras 模型检查点保存期间出错:'OSError:无法创建文件。没有权限'
- angular - android设备上的iframe全屏问题
- bash - 保留美元?使用文件描述符使用多个管道语句输出
- android - Cordova CLI - 不更新 config.xml
- azure - 应用程序注册、服务器和客户端,每个集群一个或重复用于我的所有集群?