如何在 javascript 中使用种子生成随机数 您所在的位置:网站首页 js生成随机数字符串的方法 如何在 javascript 中使用种子生成随机数

如何在 javascript 中使用种子生成随机数

2024-07-13 10:12| 来源: 网络整理| 查看: 265

文章目录 使用种子和 SFC32 生成随机数使用种子和 Mulberry32 生成随机数使用种子和 Xoshiro128** 生成随机数使用种子和 JSF 生成随机数使用 seedrandom.js 生成随机数

本文介绍如何使用种子从 PRNG 生成随机数。 同时,确保 PRNG 的种子具有高熵是最佳实践。

因此,我们将使用哈希函数来生成种子。 之后,我们将种子传递给 PRNG。

使用种子和 SFC32 生成随机数

SFC32 或 Simple Fast Counter 是 PractRand 的快速 PRNG(主要使用 C 语言),它在 JavaScript 中有一个 128 位状态的实现,而且速度非常快。 SFC32 至少需要一个种子来生成随机数。

我们将使用哈希函数生成这个种子,这是 MurmurHash3 的 JavaScript 实现,它需要一个初始字符串来生成种子。 结果,我们传入了一个字符串。

在下面的代码中,我们生成种子并将其传递给返回随机数的 SFC32。

代码:

// Define the Murmur3Hash function function MurmurHash3(string) { let i = 0; for (i, hash = 1779033703 ^ string.length; i // Return the hash that you can use as a seed hash = Math.imul(hash ^ (hash >>> 16), 2246822507); hash = Math.imul(hash ^ (hash >>> 13), 3266489909); return (hash ^= hash >>> 16) >>> 0; } } function SimpleFastCounter32(seed_1, seed_2, seed_3, seed_4) { return () => { seed_1 >>>= 0; seed_2 >>>= 0; seed_3 >>>= 0; seed_4 >>>= 0; let cast32 = (seed_1 + seed_2) | 0; seed_1 = seed_2 ^ seed_2 >>> 9; seed_2 = seed_3 + (seed_3 >> 0) / 4294967296; } } let generate_seed = MurmurHash3("String for the Seed Key"); let random_number = SimpleFastCounter32(generate_seed(), generate_seed()); console.log(random_number()); console.log(random_number());

输出:

0.837073584087193 0.3599331611767411 使用种子和 Mulberry32 生成随机数

Mulberry32 也是一个 PRNG,尽管代码结构比 SFC32 更简单。 与至少需要一个种子的 SFC32 相反。

我们将使用 MurmurHash3 使用字符串生成种子。 在以下示例中,我们使用 for 循环和 Mulberry32 生成五个随机数。

代码:

// Define the Murmur3Hash function function MurmurHash3(string) { let i = 0; for (i, hash = 1779033703 ^ string.length; i // Return the hash that you can use as a seed hash = Math.imul(hash ^ (hash >>> 16), 2246822507); hash = Math.imul(hash ^ (hash >>> 13), 3266489909); return (hash ^= hash >>> 16) >>> 0; } } function Mulberry32(string) { return () => { let for_bit32_mul = string += 0x6D2B79F5; let cast32_one = for_bit32_mul ^ for_bit32_mul >>> 15; let cast32_two = for_bit32_mul | 1; for_bit32_mul = Math.imul(cast32_one, cast32_two); for_bit32_mul ^= for_bit32_mul + Math.imul(for_bit32_mul ^ for_bit32_mul >>> 7, for_bit32_mul | 61); return ((for_bit32_mul ^ for_bit32_mul >>> 14) >>> 0) / 4294967296; } } let generate_seed = MurmurHash3("String for the Seed Key"); let random_number = Mulberry32(generate_seed()); for (let i = 0; i let i = 0; for (i, hash = 1779033703 ^ string.length; i // Return the hash that you can use as a seed hash = Math.imul(hash ^ (hash >>> 16), 2246822507); hash = Math.imul(hash ^ (hash >>> 13), 3266489909); return (hash ^= hash >>> 16) >>> 0; } } function Xoshiro128_twostar(seed_1, seed_2, seed_3, seed_4) { return () => { let t = seed_2 21; return (y >>> 0) / 4294967296; } } let generate_seed = MurmurHash3("String for the Seed Key"); let random_number = Xoshiro128_twostar(generate_seed(), generate_seed()); console.log(random_number());

输出:

0.6150987280998379 使用种子和 JSF 生成随机数

Bob Jenkins 创建了 Jenkins Small Fast (JSF) 生成器,这是一种快速生成器。 不过,与 SFC32 相比,它并不快。

当您观察 JSF 的代码时,您会发现它与 SFC32 的相似之处。 在生成随机数之前,JSF 可以采用多个种子。

我们在下一个代码中使用种子和 JSF 生成十个随机数。

代码:

// Define the Murmur3Hash function function MurmurHash3(string) { let i = 0; for (i, hash = 1779033703 ^ string.length; i // Return the hash that you can use as a seed hash = Math.imul(hash ^ (hash >>> 16), 2246822507); hash = Math.imul(hash ^ (hash >>> 13), 3266489909); return (hash ^= hash >>> 16) >>> 0; } } function JenkinsSimpleFast32(seed_1, seed_2, seed_3, seed_4) { return () => { seed_1 |= 0; seed_2 |= 0; seed_3 |= 0; seed_4 |= 0; let t = seed_1 - (seed_2 > 5) | 0; seed_1 = seed_2 ^ (seed_3 > 15); seed_2 = seed_3 + seed_4 | 0; seed_3 = seed_4 + t | 0; seed_4 = seed_1 + t | 0; return (seed_4 >>> 0) / 4294967296; } } let generate_seed = MurmurHash3("String for the Seed Key"); let random_number = JenkinsSimpleFast32(generate_seed(), generate_seed()); for (let i = 0; i entropy: true }); for (let i = 0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有