matlab rng shuffle,使用boost::random作为std::random_shuffle的RNG

本文探讨如何在C++中使用boost::mt19937随机数生成器与random_shuffle配合,确保shuffle操作基于共享的状态,以重现先前生成的Mersenne Twister数值。作者分享了尝试和解决过程,以及为何全局变量是关键,同时提供了两种解决方案的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一个程序使用boost :: random的mt19937随机数生成器。我需要做一个random_shuffle,并且希望为此生成的随机数来自这个共享状态,这样他们就可以确定mersenne twister先前生成的数字。

我尝试了这样的事情:

void foo(std::vector &vec, boost::mt19937 &state)

{

struct bar {

boost::mt19937 &_state;

unsigned operator()(unsigned i) {

boost::uniform_int<> rng(0, i - 1);

return rng(_state);

}

bar(boost::mt19937 &state) : _state(state) {}

} rand(state);

std::random_shuffle(vec.begin(), vec.end(), rand);

}但是,我得到一个模板错误,用rand调用random_shuffle。然而这工作:

unsigned bar(unsigned i)

{

boost::mt19937 no_state;

boost::uniform_int<> rng(0, i - 1);

return rng(no_state);

}

void foo(std::vector &vec, boost::mt19937 &state)

{

std::random_shuffle(vec.begin(), vec.end(), bar);

}可能是因为它是一个实际的函数调用。但显然这并不能保持原来的梅森扭曲者的状态。是什么赋予了?有没有办法做我没有全局变量的事情?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值