Реклама на сайте Advertise with us

РНР - случайная фраза

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

Спасибо всем, кто еще МОЖЕТ!

С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570


Передовик Master-X (16.04.2011)
Ссылка на сообщениеДобавлено: 22/10/08 в 00:49       Ответить с цитатойцитата 

Вывожу случайную фразу этим:

Код:
<?php
srand((double)microtime()*1000000);
$rnd = rand(1,50);
include $rnd.'.txt';
?>


Фразы берутся из файлов 1-50.txt. Не нравится то, что фразы могут повторяться, к тому же, вероятность почему-то неравная: одни выводятся чаще, другие почти нет.

Сложно ли написать так, чтоб для юзера не было повторений?

0
 

127.0.0.1

С нами с 26.04.06
Сообщения: 1092
Рейтинг: 557

Ссылка на сообщениеДобавлено: 22/10/08 в 00:56       Ответить с цитатойцитата 

вообщем-то давно известно, что rand() вообщем-то генератор пвсевдослучайных чисел, и замечено, что в иной раз выдаваемые числа лежат в узком диапазоне.
я тестил как-то весьма продолжительно генерацию 1000 рандомных чисел от 0 до 100 при помощи rand() и mt_rand() и вообщем-то у ранд() всегда был диапазон где было число попаданий на 20-30% больше, у мт_ранд() дела обстояли чуть-чуть лучше.

можно попробовать следующие вариации генератора:
$rnd=rand(0,9).mt_rand(0,9);

$rnd=chr(rand(48,57)).chr(mt_rand(48,57));

6
 



С нами с 18.10.02
Сообщения: 4165
Рейтинг: 3365

Ссылка на сообщениеДобавлено: 22/10/08 в 01:05       Ответить с цитатойцитата 

Самый простой вариант воспользовать mt_rand, он вроде получше работает, хотя повторения тоже будут. Нельзя ждать от генератора псевдослучайных чисел отсутвия повторений.
Если надо совсем без повторений, то можно написать небольшой алгоритм, который бы выкидывал уже сгенеренные значения из новой последовательности для генерации.

6
 

Спасибо всем, кто еще МОЖЕТ!

С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570


Передовик Master-X (16.04.2011)
Ссылка на сообщениеДобавлено: 22/10/08 в 01:21       Ответить с цитатойцитата 

Сенкс, буду пробовать варианты.
Mika писал:
Если надо совсем без повторений, то можно написать небольшой алгоритм, который бы выкидывал уже сгенеренные значения из новой последовательности для генерации.

Если несложно. Буду благодарен.

0
 



С нами с 03.10.08
Сообщения: 129
Рейтинг: 141

Ссылка на сообщениеДобавлено: 22/10/08 в 02:41       Ответить с цитатойцитата 

Код:

<?
$count=10;
$i=1;
$a[]="";

while ($i <= $count)
{
$rnd = rand(1,10);

if (isset($a[$rnd]))
  {
  }
else
  {
    include $rnd.'.txt';
   
/*   Проверка генератора icon_smile.gif

    echo "$rnd";
    echo "<b>$a[$rnd]</b><br>";*/
       
        $a[$rnd]=$rnd;   
   $i++;
  }


}

?>


Вот такой простенький ))))

$count это сколько выводить инклудов с $rnd.'.txt'; Далее думаю понятно icon_wink.gif

0
 



С нами с 03.10.08
Сообщения: 129
Рейтинг: 141

Ссылка на сообщениеДобавлено: 22/10/08 в 02:46       Ответить с цитатойцитата 

И еще, $count не должна превышать максимального значения в функции rand

0
 

Гражданин планеты Земля

С нами с 30.03.03
Сообщения: 7217
Рейтинг: 2185

Ссылка на сообщениеДобавлено: 22/10/08 в 06:26       Ответить с цитатойцитата 

Гм, а счего вы взяли, что генератор случайных чисел не может повторяться? Он может 10 раз подряд выдать одно и тоже число! Хоть вероятность этого события ничтожно мала, но тем не менее возможна. icon_confused.gif

Гыыы

0
 



С нами с 20.01.03
Сообщения: 18003
Рейтинг: 9760


Передовик Master-X (01.03.2005) Передовик Master-X (16.03.2005) Передовик Master-X (16.10.2016) Передовик Master-X (01.11.2016) Передовик Master-X (16.11.2016) Ветеран трепа Master-X (01.12.2016)
Ссылка на сообщениеДобавлено: 22/10/08 в 08:32       Ответить с цитатойцитата 

берешь массив с числами от 1 до 50 - твои файлы,
есть фунция случайно перетосовать массив, делаешь так, потом берешь первые N-эл-ов, сколько нужно, все эти эл-ты будут разными, так как изначально такими являются, и выдаеться каждый раз случайный набор icon_smile.gif

0
 

SexBlogs.Name

С нами с 13.10.03
Сообщения: 3159
Рейтинг: 962

Ссылка на сообщениеДобавлено: 22/10/08 в 08:36       Ответить с цитатойцитата 

я так и делал, когда столкнулся с той же проблемой, миксовал массив
Код:
shuffle($array);
и брал первый icon_smile.gif

еще можно попробывать выбирать случайный элемент массива:
Код:
$rand_array = array_rand($array,2);

Submit your blog to the sex blogs list. PR=3 Quickly approve! 10 posts min. Ping every 6 hour!

0
 

Спасибо всем, кто еще МОЖЕТ!

С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570


Передовик Master-X (16.04.2011)
Ссылка на сообщениеДобавлено: 22/10/08 в 12:24       Ответить с цитатойцитата 

Я понимаю, что при рандоме избежать повторений невозможно. Вопрос был в том, ВОЗМОЖНО ЛИ избежать повторений какими-то способами (в пределах сессии, открытого браузера). Скажем, создается массив из показанных элементов и записывается куда-то. Все элементы перебрались - начинается заново. Юзер браузер закрыл - массив удаляется. Нагрузка получается только на количество юзеров, которые онлайн. Но наверное это сложно.

0
 

SexBlogs.Name

С нами с 13.10.03
Сообщения: 3159
Рейтинг: 962

Ссылка на сообщениеДобавлено: 22/10/08 в 12:47       Ответить с цитатойцитата 

в зависимости от задач конечно ...
но если перемешать массив и потом по очереди брать из него элементы то получится случайный и не повторится icon_smile.gif

Submit your blog to the sex blogs list. PR=3 Quickly approve! 10 posts min. Ping every 6 hour!

0
 



С нами с 20.01.03
Сообщения: 18003
Рейтинг: 9760


Передовик Master-X (01.03.2005) Передовик Master-X (16.03.2005) Передовик Master-X (16.10.2016) Передовик Master-X (01.11.2016) Передовик Master-X (16.11.2016) Ветеран трепа Master-X (01.12.2016)
Ссылка на сообщениеДобавлено: 22/10/08 в 12:56       Ответить с цитатойцитата 

photomuza писал:
Я понимаю, что при рандоме избежать повторений невозможно. Вопрос был в том, ВОЗМОЖНО ЛИ избежать повторений какими-то способами (в пределах сессии, открытого браузера). Скажем, создается массив из показанных элементов и записывается куда-то. Все элементы перебрались - начинается заново. Юзер браузер закрыл - массив удаляется. Нагрузка получается только на количество юзеров, которые онлайн. Но наверное это сложно.

перед записью куда-то посмотреть есть ли он уже там, для массива ф-ия in_array, если есть - генерить другой, нет - добавлять, и заодно проверять размеры этого куда-то, если там уже все элементы - обнулять

0
 

127.0.0.1

С нами с 26.04.06
Сообщения: 1092
Рейтинг: 557

Ссылка на сообщениеДобавлено: 22/10/08 в 13:41       Ответить с цитатойцитата 

избежать повторений не удасться. можно лишь уменьшить количество повторений, увеличив диапазон выборки скажем с 1 до 100
но как подсказывают опытные люди, можно испробовать и такой вариант:
Код:

shuffle($array);
shuffle($array);
include(array_shift($array).".txt");

0
 

SexBlogs.Name

С нами с 13.10.03
Сообщения: 3159
Рейтинг: 962

Ссылка на сообщениеДобавлено: 22/10/08 в 13:53       Ответить с цитатойцитата 

localhost писал:
избежать повторений не удасться.
почему? если перемешать а потом брать элементы по очереди?

Submit your blog to the sex blogs list. PR=3 Quickly approve! 10 posts min. Ping every 6 hour!

0
 



С нами с 03.10.08
Сообщения: 129
Рейтинг: 141

Ссылка на сообщениеДобавлено: 22/10/08 в 16:32       Ответить с цитатойцитата 

localhost писал:
избежать повторений не удасться.


Ну вот же код, повторений в рандоме нет

Код:
<?
$count=10;
$i=1;
$a[]="";

while ($i <= $count)
{
$rnd = rand(1,10);

if (isset($a[$rnd]))
  {
  }
else
  {
    include $rnd.'.txt';
   
/*   Проверка генератора 

    echo "$rnd";
    echo "<b>$a[$rnd]</b><br>";*/
       
        $a[$rnd]=$rnd;   
   $i++;
  }


}

?>

0
 

127.0.0.1

С нами с 26.04.06
Сообщения: 1092
Рейтинг: 557

Ссылка на сообщениеДобавлено: 22/10/08 в 17:32       Ответить с цитатойцитата 

Lamagro писал:
почему? если перемешать а потом брать элементы по очереди?

я про функцию rand() имел ввиду.

0
 

Спасибо всем, кто еще МОЖЕТ!

С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570


Передовик Master-X (16.04.2011)
Ссылка на сообщениеДобавлено: 22/10/08 в 18:49       Ответить с цитатойцитата 

TRUE_AND_FALSE писал:
Ну вот же код, повторений в рандоме нет[/code]

Если так, то как мне его применить? Я в РНР почти нуб. Данный код выдает мне перемешанный список. Если внизу приписываю echo "$rnd"; то все равно повторения есть, даже одна цифра подряд.

0
 



С нами с 03.05.07
Сообщения: 801
Рейтинг: 825

Ссылка на сообщениеДобавлено: 22/10/08 в 19:29       Ответить с цитатойцитата 

photomuza писал:
Я понимаю, что при рандоме избежать повторений невозможно. Вопрос был в том, ВОЗМОЖНО ЛИ избежать повторений какими-то способами (в пределах сессии, открытого браузера). Скажем, создается массив из показанных элементов и записывается куда-то. Все элементы перебрались - начинается заново. Юзер браузер закрыл - массив удаляется. Нагрузка получается только на количество юзеров, которые онлайн. Но наверное это сложно.

Ничего сложного:
Код:

if (!isset($_COOKIE["rnd"]) || !explode("|",$_COOKIE["rnd"]))
{
$range=range(1,50);
shuffle($range);
}
else
$range=explode("|",$_COOKIE["rnd"]);

$file=array_shift($range);
setcookie("rnd",join("|",$range));
include "$file.txt";


В range(1,50) задаётся диапазон рэндома. Принцип простой - в куках, до закрытия браузера, хранятся все неиспользованные значения. И каждый раз выдирается одно. Когда значения заканчиваются, всё идёт заново. Думаю, проще не сделать.

создай свою партнёрку

6
 

Спасибо всем, кто еще МОЖЕТ!

С нами с 25.07.04
Сообщения: 3875
Рейтинг: 1570


Передовик Master-X (16.04.2011)
Ссылка на сообщениеДобавлено: 22/10/08 в 20:37       Ответить с цитатойцитата 

Урра, заработало! icon_smile.gif CJLOG, это работает именно так, все проверил. Если браузер не закрывается:

* Перемешивает массив и выдает по порядку.
* ВСЕ БЕЗ ПОВТОРОВ, пока не закончится массив!
* После того, как массив закончился,
* снова перемешивает и опять выдает по новому порядку.

Если открыть в новом окне, все идет сначала. Спасибо, CJLOG!

0
 



С нами с 03.10.08
Сообщения: 129
Рейтинг: 141

Ссылка на сообщениеДобавлено: 23/10/08 в 10:07       Ответить с цитатойцитата 

тьфу, ты! А я думал чтобы вывелись все фразы и тд за одних заход на страницу. icon_smile.gif

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »