This commit is contained in:
Ilya Kantor 2016-03-04 19:06:22 +03:00
parent e78e527866
commit 05a93ced80
212 changed files with 3213 additions and 3968 deletions

View file

@ -2,8 +2,7 @@
Самый простой, но неверный способ -- это сгенерировать значение в интервале `min..max` и округлить его `Math.round`, вот так:
```js
//+ run
```js run
function randomInteger(min, max) {
var rand = min + Math.random() * (max - min)
rand = Math.round(rand);
@ -13,16 +12,15 @@ function randomInteger(min, max) {
alert( randomInteger(1, 3) );
```
Эта функция работает. Но при этом она некорректна: вероятность получить крайние значения `min` и `max` будет в два раза меньше, чем любые другие.
Эта функция работает. Но при этом она некорректна: вероятность получить крайние значения `min` и `max` будет в два раза меньше, чем любые другие.
При многократном запуске этого кода вы легко заметите, что `2` выпадает чаще всех.
Это происходит из-за того, что `Math.round()` получает разнообразные случайные числа из интервала от `1` до `3`, но при округлении до ближайшего целого получится, что:
```js
//+ no-beautify
```js no-beautify
значения из диапазона 1 ... 1.49999.. станут 1
значения из диапазона 1.5 ... 2.49999.. станут 2
значения из диапазона 1.5 ... 2.49999.. станут 2
значения из диапазона 2.5 ... 2.99999.. станут 3
```
@ -32,8 +30,7 @@ alert( randomInteger(1, 3) );
Правильный способ: `Math.round(случайное от min-0.5 до max+0.5)`
```js
//+ run
```js run
*!*
function randomInteger(min, max) {
var rand = min - 0.5 + Math.random() * (max - min + 1)
@ -49,14 +46,13 @@ alert( randomInteger(5, 10) );
# Решение с floor
Альтернативный путь - применить округление `Math.floor()` к случайному числу от `min` до `max+1`.
Альтернативный путь - применить округление `Math.floor()` к случайному числу от `min` до `max+1`.
Например, для генерации целого числа от `1` до `3`, создадим вспомогательное случайное значение от `1` до `4` (не включая `4`).
Тогда `Math.floor()` округлит их так:
```js
//+ no-beautify
```js no-beautify
1 ... 1.999+ станет 1
2 ... 2.999+ станет 2
3 ... 3.999+ станет 3
@ -65,8 +61,7 @@ alert( randomInteger(5, 10) );
Все диапазоны одинаковы.
Итак, код:
```js
//+ run
```js run
*!*
function randomInteger(min, max) {
var rand = min + Math.random() * (max + 1 - min);

View file

@ -1,7 +1,9 @@
# Случайное целое от min до max
importance: 2
[importance 2]
---
# Случайное целое от min до max
Напишите функцию `randomInteger(min, max)` для генерации случайного **целого** числа между `min` и `max`, включая `min,max` как возможные значения.
Любое число из интервала `min..max` должно иметь одинаковую вероятность.
Любое число из интервала `min..max` должно иметь одинаковую вероятность.