Как я могу сгенерировать одно и то же случайное число в JavaScript и Python?

В Python, если я использую этот код:

import random
random.seed(123)
print(random.random())

Первым случайным числом всегда будет 0.052363598850944326, так как я даю ему одно и то же начальное число каждый раз, когда запускаю программу.

В JavaScript нет встроенного способа использования семян. Я попробовал сценарий JavaScript под названием mersenne-twister.js, так как это тип PRNG который использует Python. Но даже если я использую одно и то же семя, я получаю другой результат, чем в Python.

var m = new MersenneTwister(123);
m.genrand_int32();

Этот код всегда будет возвращать 0.6964691872708499 при первом запуске.

Как я могу использовать данное начальное число, чтобы получить одно и то же случайное число как в Python, так и в JavaScript?


person Pikamander2    schedule 08.07.2015    source источник
comment
Поскольку у вас есть исходный код хотя бы одного из них, переведите его на Python, и если вы все сделаете правильно, полученные числа должны быть одинаковыми.   -  person martineau    schedule 09.07.2015


Ответы (2)


Эта библиотека/плагин сработала для меня, когда я сравнил вывод Python с выводом JavaScript.

https://github.com/davidbau/seedrandom

person Nitsew    schedule 08.07.2015
comment
Используя Math.seedrandom(123); document.write(Math.random());, я получил 0.047035554534303387. Я делаю это неправильно? - person Pikamander2; 09.07.2015

Если вам не нужен криптографически безопасный генератор псевдослучайных чисел, вы можете использовать что-то вроде этого, используя функцию десятичных знаков синуса.

В питоне:

import math
def simple_random(precision=10000):
    i = 1
    while 1:
        x = math.sin(i) * precision
        yield x - math.floor(x)
        i += 1

В Javascript:

var i = 1;
function simple_random(precision=10000) {
    x = Math.sin(i++) * precision;
    return x - Math.floor(x);
}

Если вы хотите варьировать семена, вы можете использовать что-то вроде sin(a * i + b), а не sin(i) или a * sin(i + b), вам решать, чтобы найти что-то достаточно хорошее.

person fbparis    schedule 10.12.2017