Самый эффективный, основной способ иметь неповторяющиеся случайные числа объясняется этим псевдокодом. Нет необходимости иметь вложенные циклы или хешированные запросы:
// get 5 unique random numbers, possible values 0 - 19
// (assume desired number of selections < number of choices)
const int POOL_SIZE = 20;
const int VAL_COUNT = 5;
declare Array mapping[POOL_SIZE];
declare Array results[VAL_COUNT];
declare i int;
declare r int;
declare max_rand int;
// create mapping array
for (i=0; i<POOL_SIZE; i++) {
mapping[i] = i;
}
max_rand = POOL_SIZE-1; // start loop searching for maximum value (19)
for (i=0; i<VAL_COUNT; i++) {
r = Random(0, max_rand); // get random number
results[i] = mapping[r]; // grab number from map array
mapping[r] = max_rand; // place item past range at selected location
max_rand = max_rand - 1; // reduce random scope by 1
}
Предположим, что первая итерация генерирует случайное число 3 для начала (от 0 до 19). Это сделало бы результаты [0] = сопоставление [3], т. Е. Значение 3. Затем мы присвоили отображение [3] равным 19.
На следующей итерации случайное число было 5 (из 0-18). Это дало бы результаты [1] = mapping [5], т. Е. Значение 5. Затем мы назначили отображение [5] на 18.
Теперь предположим, что следующая итерация снова выбрала 3 (из 0 - 17). результатам [2] присваивается значение отображения [3], но теперь это значение не равно 3, но 19.
Эта же защита сохраняется для всех чисел, даже если у вас есть тот же номер 5 раз подряд. Например, если генератор случайных чисел дал вам 0 пять раз подряд, результаты будут следующими: [0, 19, 18, 17, 16].
Вы никогда не получите одинаковый номер дважды.
Я не вижу здесь ничего плохого (пример взят из mozilla getDate()
, ссылка , возможно, вам нужно проверить запись
var endDate = new Date('August 19, 1975 23:15:30');
console.log(endDate.getFullYear());
console.log(endDate.getMonth()+1); // 1 - 12 range
console.log(endDate.getDate());
Вот что происходит. Когда вы создаете объект Date, вы получаете дату UTC. В вашем случае вы получите 17.01.2009 в 00.00 UTC. Я полагаю, что вы находитесь в США, поэтому эта дата будет для вас 01/16.
var utcDate = new Date('2019-01-17T00:00:00.000Z');
console.log(utcDate);
console.log(utcDate.getDate()); // 16
Если вместо этого вы создадите дату с правильным часовым поясом, вы получите ожидаемую дату. Вот пример для Тихоокеанского времени (UTC-8).
var myDate = new Date('2019-01-17T00:00:00.000-08:00');
console.log(myDate);
console.log(myDate.getDate()); // 17