美文网首页
js 中的种子随机和“真随机”

js 中的种子随机和“真随机”

作者: hhkkyy | 来源:发表于2020-12-27 19:27 被阅读0次

来扯扯js里的种子随机
想当年刚学编程学c的时候感觉c的随机函数还要指定种子一步一步跳很麻烦——现在写前端写js了,遇到了需要通过种子固定结果的随机,人的一生啊,就是不可以预料。于是就到处找了一下在js里实现用种子随机的方法。

查了一点资料,明白了这个问题的大概情况:其实基本就是js阉割了这个接口(大概)

如果看java的源码可以发现其随机实现是这样的:

    protected int next(int bits) {
        long oldseed, nextseed;
        AtomicLong seed = this.seed;
        do {
            oldseed = seed.get();
            nextseed = (oldseed * multiplier + addend) & mask;
        } while (!seed.compareAndSet(oldseed, nextseed));
        return (int)(nextseed >>> (48 - bits));
    }

虽然我并不懂java()但是这里的代码还是基本能看懂的,把这段代码换成数学公式其实就是:
X[n+1] = (a·X[n] + c) mod m
即一个数列的递推公式。这个东西是一种 "伪随机数生成器"(pseudo random number generator,PRNG),特别地,这个形式的PRNG叫线性同余法(linear congruential generator, LCG)。
一般地,一个PRNG要求其具有周期性,并且希望其是均匀分布的。
对于LCG有一个重要的Hull-Dobell定理:
当且仅当
(1) c与m互素
(2) a - 1可以被所有m的质因数整除
(3) 如果m能被4整除,那么a - 1也能被4整除
以上三个条件同时满足时,X是一个周期为m的序列。

(我承认我没彻底搞清楚)不过在js里实现种子随机的思路大概明确了:首先是按照LCG整的如下一段代码:

let _seed = initSeed
const seededRandom = _ => {
  _seed = (_seed * a+ b) % m

  return rnd = _seed / m
}

然后选取符合啥啥啥定理的三个abm参数就可以了。自然,早有老哥给我们选好了参数:
a=9301
b=49297
m=233280
当然你也可以自己去找参数,不过注意除了要符合Hull-Dobell定理之外,作为随机数生产器,要让m尽量大。

好,那么接下来问题就来了:js自己的random是怎么处理的呢?mdn直接告诉了我们答案
“Math.random() 函数返回一个浮点数, 伪随机数在范围从0到小于1,也就是说,从0(包括0)往上,但是不包括1(排除1),然后您可以缩放到所需的范围。实现将初始种子选择到随机数生成算法;它不能被用户选择或重置。”
哦!源赖氏js本来就有按种子随机的功能,只是他不给你用。


js,不愧是你

此外,js中也有类似java中“真随机”的函数,“Crypto.getRandomValues() 方法让你可以获取符合密码学要求的安全的随机值。传入参数的数组被随机值填充(在加密意义上的随机)。”不过既然js主要是前端在用,那么密码学上的安全问题应该是基本用不上的(。

相关文章

  • random库

    seed()给随机数一个种子值,,默认随机种子是系统时钟。 随机种子相同,随机数相同。伪随机数。 random()...

  • 无处不在的随机数

    目录: 什么是随机数 随机数分类 伪随机数生成器 真随机数生成器 各种语言中的随机数 使用系统时间作为种子是否安全...

  • golang 生成随机数

    真随机和伪随机概念 先大概了解一下伪随机和真随机的概念。根据密码学原理,要想对一个“随机数”进行随机性检验有以下几...

  • Python笔记:Numpy常用方法-2

    Numpy随机函数 # 指定随机数种子,相同的随机数种子,生成相同的随机数 np.random.seed(10) ...

  • Unity3D利用随机数种子每次产生同样的随机数

    一般计算机的随机数都是伪随机数,以一个真随机数(随机数种子)作为初始条件,然后用一定的算法不停迭代产生随机数。Un...

  • PyTorch/Tensorflow设置随机种子 ,保证结果复现

    Pytorch随机种子设置 Tensorflow设置随机种子 第一步 仅导入设置种子和初始化种子值所需的那些库 第...

  • js 随机函数

    在写js中,我们经常遇见 js 随机函数,总结一下最近写验证码的时候 用到过的js 随机函数 Math.rando...

  • 密码学基础之伪随机数

    随机数分类 真随机数 伪随机数2.1 强伪随机数2.2 弱伪随机数 真随机数:其定义为随机样本不可重现。实际上只要...

  • JavaScript数组随机排序

    实现JS中数组随机排序的代码很简单,

  • Substrate高级语法3宠物合约--by Skyh0715

    今天我们继续宠物的高级部分 1 随机数 为了kitty 生成唯一的 id 和一些随机 dna, 可以生成随机种子 ...

网友评论

      本文标题:js 中的种子随机和“真随机”

      本文链接:https://www.haomeiwen.com/subject/dxptoktx.html