Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
РНР - случайная фраза
Новая тема
Ответить
цитата
22/10/08 в 00:49
photomuza
Вывожу случайную фразу этим:
Код:
<?php
srand((double)microtime()*1000000);
$rnd = rand(1,50);
include $rnd.'.txt';
?>
Фразы берутся из файлов 1-50.txt. Не нравится то, что фразы могут повторяться, к тому же, вероятность почему-то неравная: одни выводятся чаще, другие почти нет.
Сложно ли написать так, чтоб для юзера не было повторений?
цитата
22/10/08 в 00:56
localhost
вообщем-то давно известно, что 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));
цитата
22/10/08 в 01:05
Mika
Самый простой вариант воспользовать mt_rand, он вроде получше работает, хотя повторения тоже будут. Нельзя ждать от генератора псевдослучайных чисел отсутвия повторений.
Если надо совсем без повторений, то можно написать небольшой алгоритм, который бы выкидывал уже сгенеренные значения из новой последовательности для генерации.
цитата
22/10/08 в 01:21
photomuza
Сенкс, буду пробовать варианты.
Mika писал:
Если надо совсем без повторений, то можно написать небольшой алгоритм, который бы выкидывал уже сгенеренные значения из новой последовательности для генерации.
Если несложно. Буду благодарен.
цитата
22/10/08 в 02:41
TRUE_AND_FALSE
Код:
<?
$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++;
}
}
?>
Вот такой простенький ))))
$count это сколько выводить инклудов с $rnd.'.txt'; Далее думаю понятно
цитата
22/10/08 в 02:46
TRUE_AND_FALSE
И еще, $count не должна превышать максимального значения в функции rand
цитата
22/10/08 в 06:26
wMaster
Гм, а счего вы взяли, что генератор случайных чисел не может повторяться? Он может 10 раз подряд выдать одно и тоже число! Хоть вероятность этого события ничтожно мала, но тем не менее возможна.
цитата
22/10/08 в 08:32
SAV
берешь массив с числами от 1 до 50 - твои файлы,
есть фунция случайно перетосовать массив, делаешь так, потом берешь первые N-эл-ов, сколько нужно, все эти эл-ты будут разными, так как изначально такими являются, и выдаеться каждый раз случайный набор
цитата
22/10/08 в 08:36
Lamagro
я так и делал, когда столкнулся с той же проблемой, миксовал массив
Код:
shuffle($array);
и брал первый
еще можно попробывать выбирать случайный элемент массива:
Код:
$rand_array = array_rand($array,2);
цитата
22/10/08 в 12:24
photomuza
Я понимаю, что при рандоме избежать повторений невозможно. Вопрос был в том, ВОЗМОЖНО ЛИ избежать повторений какими-то способами (в пределах сессии, открытого браузера). Скажем, создается массив из показанных элементов и записывается куда-то. Все элементы перебрались - начинается заново. Юзер браузер закрыл - массив удаляется. Нагрузка получается только на количество юзеров, которые онлайн. Но наверное это сложно.
цитата
22/10/08 в 12:47
Lamagro
в зависимости от задач конечно ...
но если перемешать массив и потом по очереди брать из него элементы то получится случайный и не повторится
цитата
22/10/08 в 12:56
SAV
photomuza писал:
Я понимаю, что при рандоме избежать повторений невозможно. Вопрос был в том, ВОЗМОЖНО ЛИ избежать повторений какими-то способами (в пределах сессии, открытого браузера). Скажем, создается массив из показанных элементов и записывается куда-то. Все элементы перебрались - начинается заново. Юзер браузер закрыл - массив удаляется. Нагрузка получается только на количество юзеров, которые онлайн. Но наверное это сложно.
перед записью куда-то посмотреть есть ли он уже там, для массива ф-ия in_array, если есть - генерить другой, нет - добавлять, и заодно проверять размеры этого куда-то, если там уже все элементы - обнулять
цитата
22/10/08 в 13:41
localhost
избежать повторений не удасться. можно лишь уменьшить количество повторений, увеличив диапазон выборки скажем с 1 до 100
но как подсказывают опытные люди, можно испробовать и такой вариант:
Код:
shuffle($array);
shuffle($array);
include(array_shift($array).".txt");
цитата
22/10/08 в 13:53
Lamagro
localhost писал:
избежать повторений не удасться.
почему? если перемешать а потом брать элементы по очереди?
цитата
22/10/08 в 16:32
TRUE_AND_FALSE
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++;
}
}
?>
цитата
22/10/08 в 17:32
localhost
Lamagro писал:
почему? если перемешать а потом брать элементы по очереди?
я про функцию rand() имел ввиду.
цитата
22/10/08 в 18:49
photomuza
TRUE_AND_FALSE писал:
Ну вот же код, повторений в рандоме нет[/code]
Если так, то как мне его применить? Я в РНР почти нуб. Данный код выдает мне перемешанный список. Если внизу приписываю
echo "$rnd";
то все равно повторения есть, даже одна цифра подряд.
цитата
22/10/08 в 19:29
Formator
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) задаётся диапазон рэндома. Принцип простой - в куках, до закрытия браузера, хранятся все неиспользованные значения. И каждый раз выдирается одно. Когда значения заканчиваются, всё идёт заново. Думаю, проще не сделать.
цитата
22/10/08 в 20:37
photomuza
Урра, заработало!
CJLOG, это работает именно так, все проверил. Если браузер не закрывается:
* Перемешивает массив и выдает по порядку.
* ВСЕ БЕЗ ПОВТОРОВ, пока не закончится массив!
* После того, как массив закончился,
* снова перемешивает и опять выдает по новому порядку.
Если открыть в новом окне, все идет сначала. Спасибо, CJLOG!
цитата
23/10/08 в 10:07
TRUE_AND_FALSE
тьфу, ты! А я думал чтобы вывелись все фразы и тд за одних заход на страницу.
Новая тема
Ответить
Эта страница в полной версии