画两个不同的数组:
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
循环。