2015-09-11 2 views
0

Я пытаюсь создать окно предупреждения с одним случайным предложением из массива предложений внутри него. Это мой код:Всплывающее окно со случайной строкой массива

var tasks = [ 
 
    "This is the first task", 
 
    "And this is the second task", 
 
    "Third task..." 
 
]; 
 

 
var randomTask = Math.floor((Math.random() * tasks.length) - 1); 
 

 
alert(tasks[randomTask]);

Если вы запустите его, единственное, что поп говорит «не определен». Почему это не работает?

Спасибо всем, кто отвечает! :-)

+0

Собственно, когда (Math.random() * tasks.length) дает 1, то вы вычитая с 1, а затем он должен быть 0, а пол 0 равен -1. поэтому, когда вы получаете доступ к свойству -1 массива, вы становитесь неопределенным. – pankaj98

ответ

4

Math.random возвращает случайное число в диапазоне от 0 (включительно) и 1 (эксклюзив), умножить его на 3 и вычесть 1, так что вы можете получить число между -1 и 2 (где 2 является исключительным - значение всегда будет ниже, чем 2). И когда вы отрицаете floor, вы получаете -1. Вот почему вы получите неопределенными иногда

В принципе, удалить - 1 и он должен работать

+0

Тогда я не могу просто удалить «-1»? –

+0

^точно. Я просто набрал edit :) –

2

Причина заключается в том, что, то Math.random() возвращает число между 0 и 1.

Когда число 0.1xxx, это

вычисляется как

0.1xxxxx * 3 - 1 

что

Math.floor(0.3xxxx - 1) = -1 

И array[-1] является undefined.

Чтобы обойти эту проблему, вы можете использовать оператор % по полученному случайному числу. % будет обеспечивать, чтобы число всегда находилось между 0 и arr.length - 1.

var tasks = [ 
 
    "This is the first task", 
 
    "And this is the second task", 
 
    "Third task..." 
 
]; 
 

 
var randomTask = Math.floor((Math.random() * tasks.length) % tasks.length); 
 

 
alert(tasks[randomTask]);

+0

Но '* tasks.length' уже уверена в этом, не так ли? – Popnoodles

1

Это будет делать:

var tasks = [ 
    "This is the first task", 
    "And this is the second task", 
    "Third task..." 
]; 

var rand = Math.floor(Math.random() * ((tasks.length -1) - 0 + 1)) + 0; 
alert(tasks[rand]); 
+1

Как '((tasks.length -1) - 0 + 1)' какой-либо, отличный от 'tasks.length'? – Popnoodles

+1

И зачем вам когда-либо '+ 0' или' - 0'? – Popnoodles

Смежные вопросы