Случайное число не совсем случайно

#javascript #jquery #random

#javascript #jquery #Случайный

Вопрос:

Эта функция выбирает случайную цитату из текстового файла quotes.txt (каждая кавычка разделяется символом @) и отображает ее в разделе кавычек, например, <div class="quotes">quote shown here</div> при каждой загрузке страницы.

Но почему иногда оно пропускает цитату и ничего не показывает в <div> ?

 $.get('quotes.txt', function(data) {
    var quotes = data.split("@");
    var idx = Math.floor(quotes.length * Math.random());
    $('.quotes').html(quotes[idx]);
});
  

Это проблема с генератором случайных чисел (который, судя по моему чтению, не очень случайный)? Есть ли способ сделать его только случайным выбором из заданного количества кавычек, т.е. 50? Есть ли лучший способ — возможно, php — генерировать случайное число от 1 до 50?

quotes.txt выглядит так:

 Lorem ipsum dolor sit amet, consectetur adipiscing elit@ 
Fusce tincidunt, ante ut scelerisque@ 
Mauris lacinia, magna sed auctor pellentesque, diam nisl rutrum ligula@ 
Etiam tempor elementum augue, vitae cursus eros laoreet@ 
Donec imperdiet ullamcorper pharetra@ 
  

Редактировать 27.04.11 В итоге я использовал другую функцию, у которой нет проблем с отображением пустых строк. кавычки.html структурирован таким образом:

 <div class="quote">Lorem ipsum dolor sit amet, consectetur adipiscing elit</div>
<div class="quote">Lorem ipsum dolor sit amet, consectetur.</div>
  

Функция:

 $('div#quotescontainer').load('quotes.html',function(){
var $quotes = $(this).find('div.quote');
var n = $quotes.length;
var random = Math.floor( Math.random()*n );
$quotes.hide().eq(random).fadeIn();
}); 
  

Комментарии:

1. Проверьте содержимое quotes массива в отладчике.

Ответ №1:

После разделения файла на @ последний элемент в quotes , вероятно, будет пустой строкой, так как перед новой строкой в конце файла у вас есть @ .

Что касается воспринимаемой «случайности» генератора случайных чисел, здесь, вероятно, нет проблем. Люди, как известно, плохо определяют, является ли последовательность случайной или нет.

Комментарии:

1. Да. Вероятно, это все! Хороший выбор

2. Ну, я всего лишь человек 🙂 Я удалил пробелы в конце — моя ошибка — и последнее @, но безуспешно. Я снова получил пустые строки после 17, 6 и 24 загрузок страницы. Как можно исправить разделитель, чтобы я не получал пустых строк?

3. Ну, вы могли бы использовать n (перевод строки) в качестве разделителя, поскольку ваш текстовый файл уже разбит на одну кавычку в строке. Однако текстовые файлы обычно заканчиваются символом final n , и .split() метод предоставит вам одну дополнительную пустую запись в конце. Что вы могли бы сделать, так это отфильтровать результат .split() , чтобы удалить все пустые записи, прежде чем выбирать одну для отображения.

4. Спасибо, но я нашел другую функцию, которая не страдает от пустых строк. Отредактировано выше.

Ответ №2:

Я думаю, вам следует убрать знак at (@) в конце вашего quotes.txt , потому что это создаст пустую строку в переменной массива, заключенной в кавычки.

Ответ №3:

В итоге я использовал другую функцию, у которой нет проблем с отображением пустых строк. кавычки.html структурирован таким образом:

 <div class="quote">Lorem ipsum dolor sit amet, consectetur adipiscing elit</div>
<div class="quote">Lorem ipsum dolor sit amet, consectetur.</div>
  

Функция:

 $('div#quotescontainer').load('quotes.html',function(){
var $quotes = $(this).find('div.quote');
var n = $quotes.length;
var random = Math.floor( Math.random()*n );
$quotes.hide().eq(random).fadeIn();
});  
  

Ответ №4:

Это не функция jQuery, а скорее общая функция JavaScript. По крайней мере, код для создания случайного числа. Вы правы, хотя это не очень случайно. Я столкнулся с этой проблемой и нашел справку в этом сообщении в блоге, которая помогла мне.

Ответ №5:

Я думаю, причина, по которой вы можете получать пробелы, заключается в том, что ваш массив имеет завершающий пробел. Если файл заканчивается на @, а вы разделяете на @, последним элементом будет пустая строка.

Ответ №6:

Вы могли бы удалить пустые элементы из массива

  var quotes = data.split("@").filter(function(itm){return !!itm});