Ինչպե՞ս ստեղծել ֆունկցիա, որը որպես արգումենտներ ստանալով երկու իրարից տարբեր ամբողջ թվեր՝ կվերադարձնի պատահական ամբողջ թիվ՝ այդ միջակայքից:
JavaScript ծրագրավորման լեզվում կա ներդրված օբյեկտ՝ Math, որը պարունակում է տարբեր մաթեմատիկական ֆունկցիաներ և հաստատուններ։ Նշենք, որ Math օբյեկտի օգնությամբ մենք կարող ենք աշխատել միայն Number տիպին պատկանող արժեքների հետ: Վերջերս ստանդարտին ավելացված BigInt տիպին պատկանող արժեքների հետ աշխատել Math օբյեկտի օգնությամբ դեռևս հնարավոր չէ։
Math օբյեկտի մեջ կա random մեթոդը, որի կանչն ամեն անգամ վերադարձնում է կեղծ պատահական թվեր՝ 0-ից 1 միջակայքում, ընդ որում այդ վերադարձված թիվը կարող է լինել 0, սակայն 1 չի կարող լինել (այսինքն 0-ից 1 միջակայքում 0-ն ներառված է, 1-ը՝ ոչ)։ Դիտարկենք նման կանչի օրինակներ՝
Math.random(); // 0.8954891099517268
Math.random(); // 0.5237774069888097
Ինչու՞ են այս մեթոդի վերադարձրած թվերին անվանում կեղծ պատահական թվեր (pseudorandom number): Որովհետև գործնականում բավականին դժվար է գտնել իսկական պատահականությունների ստեղծման աղբյուրներ, որոնք նաև հարմար կլինեյին համակարգիչներում օգտագործելու համար, իսկ կեղծ պատահական թվերի ստեղծման գեներատորները դրանք ուղղակի ալգորիթմեր են, որոնք կարող են գործնականում լինել հուսալի, երբ անհնար է կանխատեսել հաջորդ բիթը՝ անգամ եթե գիտենք օգտագործվող ալգորիթմը, համակարգչի պրոցեսսորի ճարտարապետությունը և հոսքի բոլոր նախորդ բիթերը։
JavaScript ծրագրավորման լեզվի կեղծ պատահական թվերի ստեղծման գեներատորը հուսալի չի համարվում, և անվտանգության հետ կապված ոչ մի հարցում այն օգտագործել չի կարելի։ Վեբում այդ նպատակով կարելի է օգտագործել Web Crypto API-ն։
Ինչպես տեսանք վերևում բերված օրինակից՝ Math օբյեկտի random մեթոդը վերադարձնում է 0-ից 1 միջակայքի ոչ ամբողջ, պատահական թվեր, սակայն գործնականում մեզ հիմնականում պետք է լինում օգտագործել կամայական միջակայքի ամբողջ թվեր։ Մենք դա կարող ենք անել հետևյալ կերպ։ Ենթադրենք մեզ անհրաժեշտ է 0-ից 10 միջակայքում որևէ պատահական թիվ, ընդորում 0-ն պետք է ներառված լինի, 10-ը՝ ոչ։
Դրա համար մենք կարող ենք կանչել Math.random() մեթոդը, սակայն նրա վերադարձրած արժեքը պետք է բազմապատկել 10-ով, և կլորացնել դեպի ներքև՝ նույն Math օբյեկտի floor մեթոդի օգնությամբ։ Այն կունենա հետևյալ տեսքը՝
Math.floor(Math.random() * 10);
Այժմ ստեղծենք ֆունկցիա, որում կփաթեթավորենք այդ տրամաբանությունը և կընդլայնենք այնպես, որ որպես արգումենտ ստանալով երկու ամբողջ թվեր, մեզ վերադարձնի կեղծ պատահական թիվ այդ արգումենտների միջակայքից։ Ֆունկցիայի պարամետրերը կարող ենք անվանել min և max:
function randomNumber(min, max) {
if (min >= max) {
return max;
}
return Math.floor(Math.random() * (max - min) + min);
}
Այժմ թեսթավորենք արդյունքը օրինակ 50-ից 100 միջակայքի համար։
randomNumber(50, 100); // 77
randomNumber(50, 100); // 50
randomNumber(50, 100); // 89
Ֆունկցիան բարեհաջող աշխատում է նաև բացասական ամբողջ թվերի միջակայքում։
randomNumber(-25, -10); // -13
randomNumber(-25, -10); // -18
randomNumber(-25, -10); // -19
Եթե ուզում ենք ստանալ կեղծ պատահական թիվ min և max միջակայքից, սակայն պայմանով, որ և՛ min-ի և max-ի արժեքը լինի ներառյալ, ապա կարող ենք անել այսպես․
function getRandomInclusive(min, max) {
if (min >= max) {
return max;
}
return Math.floor(Math.random() * (max - min + 1)) + min;
}
Կանչելով ֆունկցիան ոչ մեծ միջակայքի համար (օրինակ 0-ից 5), մի քանի փորձից մենք կարող ենք համոզվել, որ այն գերազանց աշխատում է, երբեմն վերադարձնելով թե՛ min-ի և թե՛ max-ի արժեքները ներառյալ։