ÐеÑемеÑайÑе маÑÑив
ÐапиÑиÑе ÑÑнкÑÐ¸Ñ shuffle(array), коÑоÑÐ°Ñ Ð¿ÐµÑемеÑÐ¸Ð²Ð°ÐµÑ (пеÑеÑпоÑÑдоÑÐ¸Ð²Ð°ÐµÑ ÑлÑÑайнÑм обÑазом) ÑлеменÑÑ Ð¼Ð°ÑÑива.
ÐногокÑаÑнÑе пÑÐ¾Ð³Ð¾Ð½Ñ ÑеÑез shuffle могÑÑ Ð¿ÑивеÑÑи к ÑазнÑм поÑледоваÑелÑноÑÑÑм ÑлеменÑов. ÐапÑимеÑ:
let arr = [1, 2, 3];
shuffle(arr);
// arr = [3, 2, 1]
shuffle(arr);
// arr = [2, 1, 3]
shuffle(arr);
// arr = [3, 1, 2]
// ...
ÐÑе поÑледоваÑелÑноÑÑи ÑлеменÑов Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²ÑÑ Ð²ÐµÑоÑÑноÑÑÑ. ÐапÑимеÑ, [1,2,3] Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеÑпоÑÑдоÑено как [1,2,3] или [1,3,2], или [3,1,2] и Ñ.д., Ñ Ñавной веÑоÑÑноÑÑÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлÑÑаÑ.
ÐÑоÑÑÑм ÑеÑением Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ:
function shuffle(array) {
array.sort(() => Math.random() - 0.5);
}
let arr = [1, 2, 3];
shuffle(arr);
alert(arr);
ÐÑо, конеÑно, бÑÐ´ÐµÑ ÑабоÑаÑÑ, поÑÐ¾Ð¼Ñ ÑÑо Math.random() - 0.5 оÑдаÑÑ ÑлÑÑайное ÑиÑло, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸ÑелÑнÑм или оÑÑиÑаÑелÑнÑм, ÑледоваÑелÑно, ÑÑнкÑÐ¸Ñ ÑоÑÑиÑовки менÑÐµÑ Ð¿Ð¾ÑÑдок ÑлеменÑов ÑлÑÑайнÑм обÑазом.
Ðо поÑколÑÐºÑ Ð¼ÐµÑод sort не пÑедназнаÑен Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑакиÑ
ÑлÑÑаÑÑ
, не вÑе возможнÑе ваÑианÑÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²ÑÑ Ð²ÐµÑоÑÑноÑÑÑ.
ÐапÑимеÑ, ÑаÑÑмоÑÑим код ниже. Ðн запÑÑÐºÐ°ÐµÑ shuffle 1000000 Ñаз и ÑÑиÑÐ°ÐµÑ Ð²ÐµÑоÑÑноÑÑÑ Ð¿Ð¾ÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²ÑеÑ
возможнÑÑ
ваÑианÑов arr:
function shuffle(array) {
array.sort(() => Math.random() - 0.5);
}
// подÑÑÑÑ Ð²ÐµÑоÑÑноÑÑи Ð´Ð»Ñ Ð²ÑеÑ
возможнÑÑ
ваÑианÑов
let count = {
'123': 0,
'132': 0,
'213': 0,
'231': 0,
'321': 0,
'312': 0
};
for (let i = 0; i < 1000000; i++) {
let array = [1, 2, 3];
shuffle(array);
count[array.join('')]++;
}
// показаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво вÑеÑ
возможнÑÑ
ваÑианÑов
for (let key in count) {
alert(`${key}: ${count[key]}`);
}
РезÑлÑÑÐ°Ñ Ð¿ÑимеÑа (завиÑÑÑ Ð¾Ñ Ð´Ð²Ð¸Ð¶ÐºÐ° JS):
123: 250706
132: 124425
213: 249618
231: 124880
312: 125148
321: 125223
ТепеÑÑ Ð¼Ñ Ð¾ÑÑÑÑливо видим допÑÑенное оÑклонение: 123 и 213 поÑвлÑÑÑÑÑ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ ÑаÑе, Ñем оÑÑалÑнÑе ваÑианÑÑ.
РезÑлÑÑаÑÑ ÑÑого кода могÑÑ Ð²Ð°ÑÑиÑоваÑÑÑÑ Ð¿Ñи запÑÑке на ÑазнÑÑ Ð´Ð²Ð¸Ð¶ÐºÐ°Ñ JavaScript, но оÑевидно, ÑÑо Ñакой Ð¿Ð¾Ð´Ñ Ð¾Ð´ не надÑжен.
Так поÑÐµÐ¼Ñ ÑÑо не ÑабоÑаеÑ? ÐÑли говоÑиÑÑ Ð¿ÑоÑÑÑми Ñловами, Ñо sort ÑÑо «ÑÑÑнÑй ÑÑик»: Ð¼Ñ Ð±ÑоÑаем в него маÑÑив и ÑÑнкÑÐ¸Ñ ÑÑавнениÑ, Ð¾Ð¶Ð¸Ð´Ð°Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¾ÑÑоÑÑиÑованнÑй маÑÑив. Ðо из-за абÑолÑÑной Ñ
аоÑиÑноÑÑи ÑÑавнений ÑÑÑнÑй ÑÑик ÑÑ
Ð¾Ð´Ð¸Ñ Ñ Ñма, и как именно он ÑÑ
Ð¾Ð´Ð¸Ñ Ñ Ñма, завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑной его ÑеализаÑии, коÑоÑÐ°Ñ ÑазлиÑна в ÑазнÑÑ
движкаÑ
JavaScript.
ÐÑÑÑ Ð¸ дÑÑгие Ñ Ð¾ÑоÑие ÑпоÑÐ¾Ð±Ñ ÑеÑиÑÑ ÑÑÑ Ð·Ð°Ð´Ð°ÑÑ. ÐапÑимеÑ, еÑÑÑ Ð¾ÑлиÑнÑй алгоÑиÑм под названием ТаÑование ФиÑеÑа â ÐеÑÑа. СÑÑÑ Ð·Ð°ÐºÐ»ÑÑаеÑÑÑ Ð² Ñом, ÑÑÐ¾Ð±Ñ Ð¿ÑÐ¾Ñ Ð¾Ð´Ð¸ÑÑ Ð¿Ð¾ маÑÑÐ¸Ð²Ñ Ð² обÑаÑном поÑÑдке и менÑÑÑ Ð¼ÐµÑÑами каждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñо ÑлÑÑайнÑм ÑлеменÑом, коÑоÑÑй Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð¿ÐµÑед ним.
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1)); // ÑлÑÑайнÑй Ð¸Ð½Ð´ÐµÐºÑ Ð¾Ñ 0 до i
// поменÑÑÑ ÑлеменÑÑ Ð¼ÐµÑÑами
// Ð¼Ñ Ð¸ÑполÑзÑем Ð´Ð»Ñ ÑÑого ÑинÑакÑÐ¸Ñ "деÑÑÑÑкÑÑÑиÑÑÑÑее пÑиÑваивание"
// подÑобнее о нÑм - в ÑледÑÑÑиÑ
главаÑ
// Ñо же Ñамое можно запиÑаÑÑ ÐºÐ°Ðº:
// let t = array[i]; array[i] = array[j]; array[j] = t
[array[i], array[j]] = [array[j], array[i]];
}
}
ÐавайÑе пÑовеÑим ÑÑÑ ÑеализаÑÐ¸Ñ Ð½Ð° Ñом же пÑимеÑе:
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
}
// подÑÑÑÑ Ð²ÐµÑоÑÑноÑÑи Ð´Ð»Ñ Ð²ÑеÑ
возможнÑÑ
ваÑианÑов
let count = {
'123': 0,
'132': 0,
'213': 0,
'231': 0,
'321': 0,
'312': 0
};
for (let i = 0; i < 1000000; i++) {
let array = [1, 2, 3];
shuffle(array);
count[array.join('')]++;
}
// показаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво вÑеÑ
возможнÑÑ
ваÑианÑов
for (let key in count) {
alert(`${key}: ${count[key]}`);
}
ÐÑÐ¸Ð¼ÐµÑ Ð²Ñвода:
123: 166693
132: 166647
213: 166628
231: 167517
312: 166199
321: 166316
ТепеÑÑ Ð²ÑÑ Ð² поÑÑдке: вÑе ваÑианÑÑ Ð¿Ð¾ÑвлÑÑÑÑÑ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ð¹ веÑоÑÑноÑÑÑÑ.
ÐÑоме Ñого, еÑли поÑмоÑÑеÑÑ Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑелÑноÑÑи, Ñо алгоÑиÑм «ТаÑование ФиÑеÑа â ÐеÑÑа» намного бÑÑÑÑее, Ñак как в нÑм Ð½ÐµÑ Ð»Ð¸ÑÐ½Ð¸Ñ Ð·Ð°ÑÑÐ°Ñ Ð½Ð° ÑоÑÑиÑовкÑ.
