Страницы

Поиск по вопросам

среда, 22 января 2020 г.

цикл for с рандомными индексами

#javascript


for(i=0;i<10;i++) {
    console.log(i);
}


Этот код выведет последовательность 0-9.

Вопрос.  Как вывести эту последовательность(всю) в случайном порядке.

Хочется увидеть самую чистую и правильную реализацию
    


Ответы

Ответ 1



Короткий, но к сожалению, дающий неравномерное распределение способ: let arr = []; for (let i = 0; i < 10; arr[i] = i++); arr.sort(() => Math.random() - 0.5); console.log(arr); Альтернативный, более корректный вариант: function shuffle(n) { let arr = []; for (let i = 0; i < n; arr[i] = i++); return arr.map(a => { return { val: a, rnd: Math.random() } }).sort((a, b) => a.rnd - b.rnd).map(a => a.val) } console.log(shuffle(10));

Ответ 2



Если чистый, это без жуквери и андерскора/лоудаша, то вот так работает правильно: =) const range = 10; let used = {}; for (let i = 0; i < range; ++i) { let r = Math.floor(Math.random() * (range - i)); console.log((r in used) ? used[r] : r); let l = range - i - 1; used[r] = (l in used) ? used[l] : l; } С lodash будет короче: _.forEach(_.shuffle(_.range(0,10)), function(v) { console.log(v); });

Ответ 3



вариант "use strict" const range = 10; let used = Array(range); for (let i = 0; i < range; ++i) { let r = Math.floor(Math.random() * range); let l = used[i] !== void(0) ? used[i] : i; used[i] = used[r] !== void(0) ? used[r] : r; used[r] = l; } console.log(used);

Комментариев нет:

Отправить комментарий