@jslby

Как реализовать случайные числа в большом диапазоне на js?

Необходимо реализовать случайные числа в большом диапащоне. Порядка 80 символов в числе. Стандартные решения типа Math.rand не дают нужной энтропии.
Необходим именно алгоритм, потому что даже библиотеки из npm не дают нужного результата в работе как с bigint.
Созрел небольшой алгоритм:
Получить число как строку и разбить его на отдельные числа.
В рамках каждого числа получить случайное от 0 до текущего числа.
Сложить как строку и получить случайный срез от 1 до кол-ва символов в исходном числе.

Вариант не плохой, но он неравномерно будет считать. Вариантов случайных чисел в числе длинной 10 символов куда меньше, чем в числе длинной 80 символов. Но по сути они будут одинаково идти при вероятности случайного выбора. Т.е. у числа 100 будет такая же вероятность появится как и у числа 100000000,
Это происходит из-за среза. По идеи нужен некий множитель вероятности, который будет определять насколько большое число и давай в его диапазоне больше вероятностей выбора.

Как можно написать алгоритм, который будет вычислять максимально верно?
  • Вопрос задан
  • 554 просмотра
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
function rand80() {
  let result = ''+Math.floor(Math.random()*10000000000);
  for (let i = 0; i < 7; i++) {
    result += ('0000000000'+Math.floor(Math.random()*10000000000)).substr(-10);
  }
  return result;
}
console.log(rand80());

78687700753019149846288536942965286843811762227419373094448469993291737449820343
Ответ написан
@Sumor
2^256 это примерно 78 десятичных знаков
Берёте криптоалгоритм на 256 бит: можно AES, а можно и SHA256 (вам же не расшифровывать). Берёте инициализирующее значение - считаете значение - вот вам 256 почти случайных бит. Прибавляете к инициализирующему значению какое-либо другое - получаете следующее, и тд
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы