我需要一个带有个人资料的功能
int shuffledIndex(seed, index, range)
对于范围中的每个索引,返回范围中的随机其他索引,但对于单个种子,所有值将只返回一次。
对于给定的容器,有很多算法可以应用改组程序,但我不是在寻找这样的算法。
我需要一些不需要额外内存的东西,因为范围相对较大,同时会有很多同时的种子会话。
改组不需要非常强大,并且可能存在范围的限制 - 比如大小是2的幂。
你知道这样的算法吗?
答案 0 :(得分:0)
这不会特别好地改组,但是以2的幂为单位乘以奇数模数会产生双射,所以如果输入所有索引,则会得到它们的排列。您还可以添加偏移量以防止0为每个种子映射到自身。
例如,在C#或类似内容中:(要求range
为2的幂)
int shuffledIndex(int seed, int index, int range)
{
return (index * (seed | 1) + seed) & (range - 1);
}