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

236
03 января 2018, 21:02
for(i=0;i<10;i++) {
    console.log(i);
}

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

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

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

Answer 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));

Answer 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); 
});
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>

Answer 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);

READ ALSO
Объясните как делать [дубликат]

Объясните как делать [дубликат]

На данный вопрос уже ответили:

263
Различие методов call / apply в javascript? [дубликат]

Различие методов call / apply в javascript? [дубликат]

На данный вопрос уже ответили:

226
append отрабатывает дважды при ready и resize

append отрабатывает дважды при ready и resize

Имеется функция сappend внутри

257
Как работает WebPack

Как работает WebPack

У меня есть проект и в нём куча подключённых библиотек, например lodashИз этой библиотеки я использую пока только одну функцию _

239