获取C++序列中的随机数
Get random number in sequence C++
有没有一种方法可以使用随机生成器中内置的C++标准库来获得序列中的特定随机数,而不必全部保存?
像
srand(cTime);
getRand(1); // 10
getRand(2); // 8995
getRand(3); // 65464456
getRand(1); // 10
getRand(2); // 8995
getRand(1); // 10
getRand(3); // 65464456
C++11随机数引擎需要实现成员函数discard(unsigned long long z)
(§26.5.1.4),该函数将随机数序列推进z
步。复杂性保证相当薄弱:"不比z
连续调用e()
的复杂性"。该成员的存在显然只是为了在可能的情况下公开更高性能的实现,如注释274所述:
此操作在用户代码中很常见,通常可以实现以特定于发动机的方式提供显著的性能对使
z
连续的等价naive循环的改进调用CCD_ 6。
给定discard
,您可以通过对生成器进行补种、丢弃n-1
值并使用下一个生成的值,轻松实现按顺序检索n
的要求。
我不知道哪种标准RNG引擎(如果有的话)适用于discard
的有效实现。花点时间做一些调查和分析可能是值得的。
您必须保存数字。可能还有其他变体,但它仍然需要保存一个数字列表(例如,根据getRand()
的参数使用不同的种子,但这与保存它们相比并没有什么好处)。
像这样的东西会相当好地工作,我想说:
int getRand(int n)
{
static std::map<int, int> mrand;
// Check if it's there.
if ((std::map::iterator it = mrand.find(n)) != mrand.end())
{
return it->second;
}
int r = rand();
mrand[n] = r;
return r;
}
(我还没有编译这段代码,只是把它写成了"这类事情可能会起作用")
实现getRand()
始终进行种子设定,然后返回给定的数字。不过,这会干扰系统中的所有其他随机数,而且速度会很慢,尤其是对于大索引。假设一个基于1的索引:
int getRand(int index)
{
srand(999); // fix the seed
for (int loop=1; loop<index; ++loop)
rand();
return rand();
}
类似于cdmh的帖子,
也可以使用C++11中的以下内容:
#include<random>
long getrand(int index)
{
std::default_random_engine e;
for(auto i=1;i<index;i++)
e();
return e();
}
退房:随机123
来自文件:
Random123是一个"基于计数器"的随机数生成器(CBRNG)库,其中第N个随机数可以通过对N应用无状态混合函数来获得。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 整数不会重复超过随机数
- if数组上的随机数
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 半随机数生成C++
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 有没有办法在 c++ 中同时生成随机数?如果没有,是否有解决方法?
- 具有随机数的二维数组不会更改
- 随机数未达到限制
- 我想生成许多矩阵并用随机数填充它
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- 制作具有平均值的随机数生成器
- 为什么 rand 不在我的代码中生成随机数?
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 从给定种子生成相同的随机数序列C++
- 随机数生成函数说明
- C++ 尝试生成随机数时弹出警告帮助?
- 尝试在 c++ 中创建随机数生成器并收到错误
- 从给定的随机数组值生成随机数 Arduino程序C++
- 如何在个人计算机和群集 (c++) 上生成相同的随机数