我如何移动元素从一个数组到另一个伪随机使用哈希?



画两个不同的数组:

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let newArr = [];

我想要实现的是通过伪随机循环将元素从arr移动到newArr,试图模仿Math.random()的功能,除了唯一的随机性应该反对固定的哈希数。

我正在尝试这样做,但到目前为止还没有运气:

const madeUpHash = "827354819373"
const floatIndex = "0."
const f = parseFloat(floatIndex + madeUpHash);
let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let newArr = [];
for (let i = 0; i < arr.length; i++) {
let ranNum = (f/i); // this points towards 0, meaning the next Math.Floor will eventually always retrieve index 0
let rand = Math.floor(ranNum * arr.length);
newArr.push(...arr.splice(rand, 1))
}

这不仅不起作用,而且非常可怕。
有什么可靠的方法可以做到这一点吗?我的另一个想法是循环通过哈希的单个数字(在将它们转换成数组之后)并创建一个随机数,例如ranNum = i/madeUpHash[i],但这将在i >= madeUpHash[i]之后中断,因为它将返回一个大于1的正整数。

任何想法?谢谢你。

我不确定人们是如何实现数学的。随机在javascript中,但我知道它在c。

基本上,这个想法是,你有一个哈希函数hash,和一个种子s,你应用hash(s)来得到你的X_0,对于X_(n+1),你做X_(n+1) = hash(X_n)

只要你选择一个好的散列函数,它具有你想要的随机性的特定分布,如果种子是相同的,它是非常容易和一致的。

对于C,他们正在做Linear Congruential Generator

X_(n+1) = (a * X_n + b) % m

因此,您可以使用您的哈希数作为种子并生成一系列伪随机数。基本上,您需要一个地方来存储您的种子,并在调用随机生成器时替换它(并且不要忘记应用哈希函数)。

随机性完全来自于你选择的哈希函数,要证明你得到一个好的哈希函数来生成随机数并不容易(就像我们在大多数情况下想要一个均匀分布的哈希函数一样,性能也很重要)。但我相信有文献可以为你做这些证明。

为什么用i除以ranNum?

let rand = Math.floor(f * arr.length);

应该没问题,因为您在每次迭代中减少arr.length。此外,我不确定是否增加i并从数组中删除元素,这会同时影响循环条件。也许可以使用while循环。

相关内容

最新更新