Создайте генератор псевдослучайных чисел на основе множества входов Javascript - PullRequest
0 голосов
/ 29 апреля 2020

Текущий проект, над которым я работаю, включает многомерный мир, который может иметь гораздо больше, чем просто 3 измерения, и должен получать значения для каждой позиции этого мира. У меня уже есть хороший генератор псевдослучайных чисел (PRNG), который принимает начальное значение и одно значение. Мне нужно иметь функцию, которая может использовать столько входных данных, сколько предусмотрено, и возвращать значение на основе этих позиций. PRNG также не должен полагаться на свои предыдущие значения, чтобы определить свое следующее состояние, и должен работать (как можно ближе) к тому же в любом браузере или системе.

Мой текущий PRNG работает очень хорошо для 1 вход (xxHa sh):

function random(seed, x) {
    /* mix around the bits in x: */
    x = x * 3266489917 + 374761393;
    x = (x << 17) | (x >> 15);

    /* mix around the bits in y and mix those into x: */
    x += seed * 3266489917;

    /* Give x a good stir: */
    x *= 668265263;
    x ^= x >> 15;
    x *= 2246822519;
    x ^= x >> 13;
    x *= 3266489917;
    x ^= x >> 16;

    /* trim the result and scale it to a float in [0,1): */
    return (x & 0x00ffffff) * (1 / 0x1000000);
}

Я попытался добавить дополнительные параметры и смешать их, но это не очень хорошо go (ниже):

function rand(seed, ...prams){
    let x = prams[0] + seed;

    x = x * 3266489917 + 374761393;
    x = (x << 17) | (x >> 15);

    /* mix around the bits in y and mix those into x: */
    for(let i =1; i< prams.length; i++){
        prams[i] *= seed;
        x *= prams[i] * 3266489917
    }

    /* Give x a good stir: */
    x *= 668265263;
    x ^= x >> 15;
    x *= 2246822519;
    x ^= x >> 13;
    x *= 3266489917;
    x ^= x >> 16;



    /* trim the result and scale it to a float in [0,1): */

    let val = ((x & 0x00ffffff) * (1.0 / 0x1000000))
     return val;
}

Этот не вернул никаких ошибок, но если входные данные были в другом порядке, значение было одинаковым, что означает rand(seed, 5, 1, 1) === rand(seed, 1, 5, 1) === rand(seed, 1, 1, 5), что не очень хорошо.

Мне нужна функция random(seed, ...position), который сгенерирует псевдослучайное число от 0 до 1, на которое влияют как порядок, так и все значения в массиве позиций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...