Сеянное случайное число - PullRequest
3 голосов
/ 16 марта 2012

Я давно удивляюсь. Есть ли хороший (и быстрый) способ сделать число случайным во время его засева? Есть ли хороший алгоритм для преобразования одного числа в, казалось бы, случайное число.

Небольшая иллюстрация:

specialrand(1) = 8
specialrand(2) = 5
specialrand(3) = 2
specialrand(4) = 5
specialrand(5) = 1
specialrand(1) = 8
specialrand(4) = 5
specialrand(1) = 8

Было бы очень хорошо, если бы на выходе могли быть и огромные числа.

Как примечание: я не хочу заполнять массив и рандомизировать числа, потому что я хочу быть в состоянии кормить его огромной разницей в числах, потому что я хочу, чтобы тот же вывод выводился при каждом перезапуске программы

Ответы [ 4 ]

6 голосов
/ 16 марта 2012

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

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

Вот как работает большинство базовых pRNG. Существует больше криптографически безопасных ГСЧ, но ваш стандартный Math.rand () должен работать для удовлетворения ваших потребностей.

0 голосов
/ 16 марта 2012

Вы можете использовать функциональность Дата

Math.valueOfSeed = function(n)
    {
        return Number(new Date(n%9999, n%12, n%30, n%24, n%60, n%60, n%1000));
    };

alert(Math.valueOfSeed(1) + " = " + Math.valueOfSeed(1));
alert(Math.valueOfSeed(2) + " = " + Math.valueOfSeed(2));
alert(Math.valueOfSeed(15) + " = " + Math.valueOfSeed(15));
alert(Math.valueOfSeed(5555) + " = " + Math.valueOfSeed(5555));
alert(Math.valueOfSeed(21212121) + " = " + Math.valueOfSeed(21212121));
alert(Math.valueOfSeed(6554654654) + " = " + Math.valueOfSeed(6554654654));​ 

тест равен здесь

0 голосов
/ 16 марта 2012

Попробуйте установить ключ или набор ключей, а затем написать функцию с уравнением для возврата нового числа на основе этого ключа:

очень простой пример:

function specialrand(value) {
key = array (1,2,4,6,8);
  for (k in key) {
      if (k%2 === 0) {
      value -= key[k] * value;
      } else {
      value += key[k] / value;
      }
  }
 return value;
}

однако вы можете создать очень сложное уравнение, чтобы сгенерировать «случайное» число и убедиться, что вы возвращаете одно и то же число каждый раз.

0 голосов
/ 16 марта 2012

Может быть генераторы псевдослучайных чисел - это то, что вы ищете.

Например, XORshift .

uint32_t xor128(void) {
   static uint32_t x = 123456789;
   static uint32_t y = 362436069;
   static uint32_t z = 521288629;
   static uint32_t w = 88675123;
   uint32_t t;

   t = x ^ (x << 11);
   x = y; y = z; z = w;
   return w = w ^ (w >> 19) ^ (t ^ (t >> 8));
}

Вы можете создать что-то вроде этого:

  • взять семя
  • specialrand (5) - это функция, которая берет пятое случайное число из этого начального числа
  • , или specialrand (5) - это функция, которая получает первое случайное число из начального числа + 5

Может быть, этого достаточно для вашей цели.

...