2016-12-18 6 views
4

Просто столкнулся с чем-то интересным в Javascript, экспериментируя с генерированием случайного числа в условии (это то, что он называется?) Цикла for.Javascript - Math.random in a for loop

Так что, если бы я должен был написать код так:

for (var i = 0; i < 20; i++) { 
    var count = 0; 
    for (var j = 0; j < Math.floor(Math.random() * 20); j++) { 
     count++; 
    } 
    console.log(count); 
} 

Это возвращает результат как это:

9 
5 
8 
3 
3 
2 
6 
8 
4 
4 
5 
6 
3 
3 
5 
3 
4 
5 
3 
11 

Но если бы я генерировать случайное число в переменной перед вторым циклом:

for (var i = 0; i < 20; i++) { 
    var count = 0; 
    var loopEnd = Math.floor(Math.random() * 20 + 1); 
    for (var j = 0; j < loopEnd; j++) { 
     count++; 
    } 
    console.log(count); 
} 

это возвратит результат:

11 
13 
14 
2 
19 
19 
17 
19 
2 
18 
5 
15 
18 
2 
1 
19 
16 
15 
13 
20 

Что именно происходит здесь? Это немного смутило меня. Является ли Math.random() внутри цикла for созданием нового случайного числа после каждой итерации? Проводят ли цикл код, повторяют и проверяют условие и генерируют новое случайное число каждый раз, когда он проверяет условие? Это то, что происходит, и поэтому номера в консоли меньше, чем если я использую Math.random() в переменной перед циклом for?

+2

'j

+1

Да , условие завершения цикла (включая любые вызовы функций, которые оно делает) заново инициализируется перед каждой итерацией. – Thilo

ответ

3

В первом примере это внутренний цикл:

... 
for (var j = 0; j < Math.floor(Math.random() * 20); j++) { 
    count++; 
} 
... 

прекращение условие j < Math.floor(Math.random() * 20) оценивается каждой итерации цикла, и поэтому значение прекращения меняется каждую итерацию с вызовом Math.random(), что делает его более вероятно, что цикл завершится раньше.

2

Что касается цикла, истекающий ранее в среднем, когда случайное число выбирается заново каждую итерацию:

Не вдаваясь в надлежащий статистический анализ, рассмотрим этот простой ход мысли:

Насколько вероятно, вы получите десять или более итераций?

Если вы рисуете только одно случайное число от 1 до 20, вы получите 10 или более примерно 50% времени.

Если вы получаете десять случайных чисел, вам необходимо иметь каждый из них выше первого, затем 2, затем 3 и так далее, а коэффициенты уменьшаются: 95% * 90% * 85% * ... * 50%.

+1

Это хороший момент. Интересно посмотреть на это со статистической точки зрения. Благодаря! –