如何使用Mersenne Twister生成两个数字之间的所有值一次
How to use Mersenne Twister to generate all values between two numbers exactly once
我想使用 mt19937 遍历数组并从中获取每个值一次,但以随机顺序。本质上,有没有办法使用 mt19937 一次生成特定范围内的所有数字(不仅仅是忽略重复项,而是确保它不会完全产生重复项(为了效率))?
我考虑过洗牌函数,但它只是我关心的索引;数组中的值是任意的,但它们对应的索引很重要。我有一个 1 的矩阵,我需要随机选择一个索引并将该 1 转换为 0。但是我不想执行此计算超过必要的次数(与矩阵中的元素数量完全相同)。
假设数组的大小为 N
并且您不想重新排列它:
- 生成第二个数组,大小也为
N
。 - 使用 Fisher-Yates-Knuth 洗牌对第二个数组进行洗牌。
- 按照第二个数组指定的顺序利用第一个数组的元素。
Fisher-Yates-Knuth shuffle 可以按如下方式实现:
//To shuffle an array a of n elements (indices 0..n-1):
for i from 0 to n−2 do
j ← random integer such that i ≤ j < n
swap a[i] and a[j]
您也可以使用std::shuffle
:
std::shuffle(a.begin(), a.end(), std::default_random_engine(seed));
因此,您需要创建一个值列表,然后将它们洗牌。
虽然有一个随机播放功能,但算法很简单。从索引 0 开始,用 0 到 N-1 范围内的随机值交换,然后转到索引 1 并使用 1 到 N-1 范围内的随机值交换,依此类推,不要交换 0 到 N-1,因为这不提供真正的随机排列。
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- 为什么我的信号处理程序只执行一次?
- 为什么我的 cout 一次执行,尽管 cin 应该在两者之间读取?
- cmake-一次针对多个体系结构,而无需在构建之间进行手动清理
- 如何使用Mersenne Twister生成两个数字之间的所有值一次
- 这将是在将函数分配给变量或一次又一次地调用函数之间使用函数结果的最佳方式