ÐеÑемÑÑайÑе маÑив
ÐапиÑÑÑÑ ÑÑнкÑÑÑ 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
Ð¢ÐµÐ¿ÐµÑ Ð²Ñе в поÑÑдкÑ: вÑÑ Ð²Ð°ÑÑанÑи зʼÑвлÑÑÑÑÑÑ Ð· Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¾Ñ Ð¹Ð¼Ð¾Ð²ÑÑнÑÑÑÑ.
ÐÑÑм Ñого, ÑкÑо подивиÑиÑÑ Ð· ÑоÑки зоÑÑ Ð¿ÑодÑкÑивноÑÑÑ, Ñо алгоÑиÑм âТаÑÑÐ²Ð°Ð½Ð½Ñ Ð¤ÑÑеÑа-ÐйÑÑаâ набагаÑо ÑвидÑий, оÑкÑлÑки в нÑÐ¾Ð¼Ñ Ð½ÐµÐ¼Ð°Ñ Ð·Ð°Ð¹Ð²Ð¸Ñ Ð²Ð¸ÑÑÐ°Ñ Ð½Ð° ÑоÑÑÑваннÑ.