我想使用mt19937循环数组并从中获取每个值一次,但是以随机顺序。从本质上讲,有没有办法使用mt19937生成一个特定范围内的所有数字一次(不仅忽略重复,但确保它不会完全产生重复(为了提高效率))?
我考虑过洗牌功能,但它只是我关心的指数;数组中的值是任意的,但它们的相应索引很重要。我有一个1的矩阵,我需要随机选择一个索引并将其转换为0.但我不想进行超过必要的计算(完全与矩阵)。
答案 0 :(得分:1)
假设您的数组大小为N
,并且您不想重新排列它:
N
。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));
答案 1 :(得分:0)
所以你需要创建一个值列表,然后将它们洗牌。
虽然有一个随机播放的功能,但算法很简单。从索引0开始并使用0到N-1范围内的随机值进行交换,然后转到索引1并使用1到N-1范围内的随机值进行交换,依此类推,不要交换0到N-1,因为它没有提供真正随机的排列。