我有set
随机生成的整数,evolve(set)
函数接受一个集合,删除两个整数并插入4个新整数。我希望套装永远不会有重复的整数。也就是说,无论我应用evolve(evolve(...evolve(set)))
多少次,它都不应该有重复的值。
什么是combine(int x, int y) -> int
的简单选择,可以保证财产概率很高?
// Helpers.
var range = length => Array.from({length}, i => i);
var random = () => (Math.random() * Math.pow(2,31) | 0);
var removeRandom = set => set.splice(random() % set.length, 1)[0];
var hasRepeated = set => !set.sort((a,b) => a - b).reduce((a,b) => a && a !== b && b || 0, -1);
// Receives two parent ints, returns 4 derived ints.
// Can't use random() here; it must generate 4 ints
// from simple functions (multiplication, bitwise
// operations, etc.) of `a` and `b`.
function combine(a, b) {
return [a + b + 0, a + b + 1, a + b + 2, a + b + 3];
};
// Removes two ints from set, inserts 4 ints.
function evolve(set) {
var a = removeRandom(set);
var b = removeRandom(set);
set.push(...combine(a,b));
};
// Random initial set of ints.
var set = range(64).map(random);
// No matter how many times `evolve` is applied,
// the set should never have repeated ints.
for (var i = 0; i < 50000; ++i) {
evolve(set);
}
// Prints `true` if algorithm is correct
// (no repeated number was generated).
console.log(!hasRepeated(set));
请注意,combine(a,b)
只是将它们加在一起。这是一个糟糕的选择;只有50000次调用evolve
,它已经无法通过测试。我可以使用线性同余生成器,但我想知道它是否比那些条件下的更简单。也许有些使用XOR?
答案 0 :(得分:0)
如果你有空间来保存一个包含可能条目的数组的数组,你可以随机化它,然后跟踪绑定你的集合的索引,增加起始索引以删除元素和结束索引来添加它们
您可以预先随机化整个数组,也可以随着结束索引的增加而增加。