Как стать автором
Обновить

Комментарии 15

Такое впечатление, что его ещё используют для генерации тем постов на Хабр.
Ждём следующую статью по использованию alert().
А что бы неповадно было копипастить о работе с консолью, оставлю это здесь:
habr.com/ru/post/114483

Учитывая что там внутри xorshift — плохо что не дают явно выставить seed для контролируемой генерации. Из за этого генератор псевдослучайных чисел нужно писать руками, хотя он уже есть !?

Когда-то был того же мнения, но потом увидел реализацию подбора картинок по хэшам из руби (они в 1.9.4 кажется в патче без изменений номера поменяли агоритм)


В общем лучше пусть тем кому это надо, явно гуглят и юзает библиотеки. Так в случае чего хотя бы заменить проще...


П.С.: seedrandom.js

Из за этого генератор псевдослучайных чисел нужно писать руками, хотя он уже есть !?
А я так и сделал, «портировал» широко известную хеш-функцию. Производительность по сравнению с нативной почти не изменилась.
код
const BJXorShift = (x) => {
  x += x << 10;
  x ^= x >>  6;
  x += x <<  3;
  x ^= x >> 11;
  x += x << 15;
  return x;
}

let seed = (Math.random() * 0xffffffff) >>> 0;
const HM = 0x874C40D4 >>> 0;
...
seed = BJXorShift(seed ^ HM);

Как использовать рандомайзер, это по-моему слишком тривиальная тема… гораздо интереснее было бы узнать об особенностях его JS реализации, и в каком случае его последовательность может быть воспроизведена?
Генератор надёжных паролей — это как раз совсем ненадежные пароли и плохой пример использования Math.random()

Стоит заметить, что раньше по Math.random() можно было определить, что зашел бот Гугла, т.к. выдавал определенную последовательность ПСЧ.

минутччччку, а где снежинки?

Подвис в поисках способа предсказать результаты Math.random() после получения нескольких значений и нашёл. Проверял под Хромом. Только одно значение пропускает, а дальше вроде всё точно. Статья, из неё код на Питоне. В браузере в консоли вводим


_ = []; for(var i=0; i<5; ++i) { _.push(Math.random()) } ; console.log(_)

вставляем в строку 147, потом можно повторить генерацию случайных чисел на консоли и запустить питоновский скрипт, смотреть что выдаст. Мне, правда, долго выдавал ошибки про z3 и BitVecs но вот тут рабочее решение онлайн. Первый раз будет долго обновлять библиотеки, в том числе лишние. Без этого никак не запускалось.


Так что не используйте Math.random() там, где важна непредсказуемость.

Подвис в поисках способа предсказать результаты Math.random() после получения нескольких значений и нашёл. Проверял под Хромом. Только одно значение пропускает, а дальше вроде всё точно. Статья, из неё код на Питоне. В браузере в консоли вводим


_ = []; for(var i=0; i<5; ++i) { _.push(Math.random()) } ; console.log(_)

вставляем в строку 147, потом можно повторить генерацию случайных чисел на консоли и запустить питоновский скрипт, смотреть что выдаст. Мне, правда, долго выдавал ошибки про z3 и BitVecs но вот тут рабочее решение онлайн. Первый раз будет долго обновлять библиотеки, в том числе лишние. Без этого никак не запускалось.


Так что не используйте Math.random() там, где важна непредсказуемость.


P.S. Интересно, похоже, в публичной версии другой порядок установки модулей и не работает. В общем, можно там же создать свой аккаунт, скопировать этот файл и подключить последовательно z3, z3-solver и mythril. Ну, или локально поднимать.

Как заголовок «Как получать уникальные значения, в которых отсутствуют повторы?» коррелирует с алгоритмом перемешивания массива? От повторов это не избавляет. И сам вопрос как-будто бы задан совсем о другом.
механизм получения таких значений может быть основан на так называемом «тасовании Фишера-Йетса»

Берем массив со значениями от 0 до 1 000 000, перемешиваем, берем первые 5-10-100 чисел. Хотя статья этого не описывает, да.
Да, так уже понятнее, спасибо. Но в статье, конечно, об этом ничего нет :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий