Мне было поручено перенести Java Java.util.Random()
на JavaScript, и я столкнулся с огромной ошибкой / неточностью в производительности, используя побитовые операторы в Javascript для достаточно больших чисел. Некоторые беглые исследования утверждают, что «побитовые операторы в JavaScript по своей природе медленны», потому что внутренне кажется, что JavaScript преобразует все свои двойные значения в 32-битные целые числа со знаком для выполнения побитовых операций ( см. Здесь , чтобы узнать больше на этом.) Из-за этого я не могу сделать прямой порт генератора случайных чисел Java, и мне нужно получить те же числовые результаты, что и Java.util.Random()
. Пишу что-то вроде
this.next = function(bits) {
if (!bits) {
bits = 48;
}
this.seed = (this.seed * 25214903917 + 11) & ((1 << 48) - 1);
return this.seed >>> (48 - bits);
};
Код
(который является почти прямым портом Java.util.Random()
) не будет работать должным образом, поскольку Javascript не может выполнять побитовые операции с целым числом такого размера.)
Я выяснил, что я могу просто создать генератор случайных чисел в 32-битном пространстве, используя алгоритм Лемера, но хитрость в том, что мне нужно получить те же значения, что и при Java.util.Random()
. Что я должен сделать, чтобы сделать более быстрый и функциональный порт?