洗牌后的索引无需内存

时间:2014-12-16 18:58:32

标签: algorithm shuffle

我需要一个带有个人资料的功能

int shuffledIndex(seed, index, range)

对于范围中的每个索引,返回范围中的随机其他索引,但对于单个种子,所有值将只返回一次。

对于给定的容器,有很多算法可以应用改组程序,但我不是在寻找这样的算法。

我需要一些不需要额外内存的东西,因为范围相对较大,同时会有很多同时的种子会话。

改组不需要非常强大,并且可能存在范围的限制 - 比如大小是2的幂。

你知道这样的算法吗?

1 个答案:

答案 0 :(得分:0)

这不会特别好地改组,但是以2的幂为单位乘以奇数模数会产生双射,所以如果输入所有索引,则会得到它们的排列。您还可以添加偏移量以防止0为每个种子映射到自身。

例如,在C#或类似内容中:(要求range为2的幂)

int shuffledIndex(int seed, int index, int range)
{
    return (index * (seed | 1) + seed) & (range - 1);
}