Skip to content

Latest commit

 

History

History
62 lines (45 loc) · 5.53 KB

Generating Random Integers within a Range in JavaScript.hy.md

File metadata and controls

62 lines (45 loc) · 5.53 KB

Ինչպե՞ս ստեղծել ֆունկցիա, որը որպես արգումենտներ ստանալով երկու իրարից տարբեր ամբողջ թվեր՝ կվերադարձնի պատահական ամբողջ թիվ՝ այդ միջակայքից:

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-ի արժեքները ներառյալ։