Jump to content
  • 0

Случайность


Fenix
 Share

Question

Недавно получил задание: Написать интересный небольшой скрипт с rand, mt_rand, array_rand, shuffle. Обязательно надо придумать что-нибудь интересное. Есть конечно несколько идей:

1) Стих или басня. Есть к примеру массив со строками некого стиха или басти или ещё чего-нибудь подобного. При каждом вызове подярок менялся. В конце скрипта выводились строки массива по порядку, т. е. каждый раз по разному. При перезагрузке страницы каждый раз стих изменелся, но не терял смысла, а сам смысл изменялся.

2) Картинка. Есть скажем так 10 картинок. Скрипт составлял каждый раз разную картинку.

Собственно и все. Если есть какие-либо предложения пишите. Меня особенно интересует первый, предложеный мной вариант. Нет ли такого стишка или басни?

Link to comment
Share on other sites

  • Answers 51
  • Created
  • Last Reply

Top Posters For This Question

Top Posters For This Question

Recommended Posts

  • 0

Скачай вот отсюда гостевую (Лайт-Гостевая 1.2) и посмотри на их реализацию, а по аналогии уже сможешь сделать сам.

Да, и вот еще, а что мешает спросить у гугла, религия? Говорю так потому что задачка не сложная.

Edited by rus
Link to comment
Share on other sites

  • 0
Скачай вот отсюда гостевую (Лайт-Гостевая 1.2) и посмотри на их реализацию, а по аналогии уже сможешь сделать сам.

Да, и вот еще, а что мешает спросить у гугла, религия? Говорю так потому что задачка не сложная.

Ты видимо не так понял. Как сделать случайный вывод я знаю. Мне нужно придумать какую-нибудь интересную штучку с этим.

Link to comment
Share on other sites

  • 0
Ты видимо не так понял. Как сделать случайный вывод я знаю. Мне нужно придумать какую-нибудь интересную штучку с этим.

Все зависит от задачи, а если нет задачи, то тут уже нужна фантазия, вот с этим я уже не могу помочь, так как у самого хромает фантазия. :)

Обычно, делают капчу, новости, анекдоты, картинки, товар - все это можно выводить случайно, можно так же совместить что-то одно с другим...

Только не понятно, какова цель задумки?

Link to comment
Share on other sites

  • 0

Подробнее про рулетку? о_О Посетитель делает ставку в рублях, ты случайно выбираешь номер. Если он угадал, ты ему платишь, если он не угадал - забираешь рубли себе B)

Ммм.. ну из интересного могу ещё такое придумать: С Солнечную систему влетает метеорит/комета/планета (в этом и есть часть элемента случайности). Рассчитать и нарисовать его траекторию в зависимости от начальных характеристик. Учитывать притяжение всех 8 планет, Солнца, пояса астероидов (хотя бы приблизительно) и псяческого Плутона. Наальное положение планет так же рандомно. В процессе продвижения прилетевшего тела планеты движутся.) Ну и потом поглядеть сколько раз в Землю врежется :lol: Для расчётов нужа будет одна формула (F=G*M*m/R^2) и немного геометрии. Для движения планет, правда, ещё одна (y=R1*sin(u); x=R2*cos(u); R1, R2 - радиусы эллиптической орбиты).

Масса, вектор и начальная точка влетевшего тела случайны.

Edited by Int
Link to comment
Share on other sites

  • 0
Подробнее про рулетку? о_О Посетитель делает ставку в рублях, ты случайно выбираешь номер. Если он угадал, ты ему платишь, если он не угадал - забираешь рубли себе :lol:

Ммм.. ну из интересного могу ещё такое придумать: С Солнечную систему влетает метеорит/комета/планета (в этом и есть часть элемента случайности). Рассчитать и нарисовать его траекторию в зависимости от начальных характеристик. Учитывать притяжение всех 8 планет, Солнца, пояса астероидов (хотя бы приблизительно) и псяческого Плутона. Наальное положение планет так же рандомно. В процессе продвижения прилетевшего тела планеты движутся.) Ну и потом поглядеть сколько раз в Землю врежется B) Для расчётов нужа будет одна формула (F=G*M*m/R^2) и немного геометрии. Для движения планет, правда, ещё одна (y=R1*sin(u); x=R2*cos(u); R1, R2 - радиусы эллиптической орбиты).

Масса, вектор и начальная точка влетевшего тела случайны.

Думаешь я смогу такое сделать? Я даже ничего про синусы и косинусы незнаю. И ты предлагаешь мне расчитать и нарисовать траекторию с влиянием остальных небесных тел. А ты сам сможешь такое сделать?

Link to comment
Share on other sites

  • 0

Можно написать симулятор эволюции живых организмов. Организм -- массив некоторых величин ("генов"), начальные значения всех величин абсолютно случайны, но некоторые значения предпочтительнее (критерий отбора). Организмы могут обмениваться генами друг с другом в процессе полового размножения, порождая новые организмы с их случайной комбинацией, кроме того, гены могут мутировать — менять значение на совсем произвольное с какой-то очень маленькой вероятностью (напр., у каждого тысячного "новорожденного" организма). Организмы с менее оптимальным набором генов имеют меньшую вероятность оставить потомство, чем с более оптимальными. И посмотреть, что получится через сотню-тысячу поколений :). На Хабре был занятный пример про эволюцию часовых механизмов (там вроде даже ссылки на какой-то код были), можно взять за основу :)

Link to comment
Share on other sites

  • 0
Можно написать симулятор эволюции живых организмов. Организм -- массив некоторых величин ("генов"), начальные значения всех величин абсолютно случайны, но некоторые значения предпочтительнее (критерий отбора). Организмы могут обмениваться генами друг с другом в процессе полового размножения, порождая новые организмы с их случайной комбинацией, кроме того, гены могут мутировать — менять значение на совсем произвольное с какой-то очень маленькой вероятностью (напр., у каждого тысячного "новорожденного" организма). Организмы с менее оптимальным набором генов имеют меньшую вероятность оставить потомство, чем с более оптимальными. И посмотреть, что получится через сотню-тысячу поколений :lol:. На Хабре был занятный пример про эволюцию часовых механизмов (там вроде даже ссылки на какой-то код были), можно взять за основу B)

Спасибо.

Link to comment
Share on other sites

  • 0

помню, когда учился, была лабораторная вот по какой теме (SelenIT напомнил про организмы):

- в окне программы есть поле, разделенное на мелкие точки. Эти точки являются живыми организмами. Пользователь в начале ставит несколько таких точек на поле, некоторые рядом, а некоторые вразброс.

- далее несколько кнопок: пуск, стоп и пауза (здесь вообще-то задача на потоки была). Когда пользователь нажимает на кнопку пуск, начинается развитие организмов. Чем больше организмов стоят рядом тем больше шансов, что в соседней клетке появится новый организм. Но до определенного предела. Если их станет очень много, то некоторые начнут умирать из-за перенаселения.

Чем меньше рядом стоящих организмов, тем больше шансов, что старые умрут. Вобщем все как в жизни.

А случайность здесь в выборе клетки, в которой родится новая или умрет старая, при одинаковых параметрах у нескольких соседних.

Link to comment
Share on other sites

  • 0
А ты сам сможешь такое сделать?
Сделать могу, но вот с визуализацией будут сложности :lol: Движущиеся планеты будет тяжело изобразить. А статичные довольно просто. Единственная сложность будет, если вектор входа в систему будет под углом к плоскости орбит планет. Тут пойдут и огромные расчёты и проекции при рисовании. Помню, в школе на паскале и не такое рисовали B)

//Про синусы и косинусы рассказывают примерно в 7-м классе. Точнее не помню.

//А в предыдущем посте описана игра Жизнь, и в заявленном виде (пуск-стоп) на php её реализовать не получится

Edited by Int
Link to comment
Share on other sites

  • 0
Сделать могу, но вот с визуализацией будут сложности :lol: Движущиеся планеты будет тяжело изобразить. А статичные довольно просто. Единственная сложность будет, если вектор входа в систему будет под углом к плоскости орбит планет. Тут пойдут и огромные расчёты и проекции при рисовании. Помню, в школе на паскале и не такое рисовали B)

//Про синусы и косинусы рассказывают примерно в 7-м классе. Точнее не помню.

//А в предыдущем посте описана игра Жизнь, и в заявленном виде (пуск-стоп) на php её реализовать не получится

Сделай хотя бы так. Лично я не представляю как расчитать траекторию тела.

//Я в 8 классе.

Link to comment
Share on other sites

  • 0

А, ну если в 8, то ладно :lol:

Хорошо, постараюсь сварганить такую штуковину, вспомню молодость. У меня как раз есть час времени.

Траектория рассчитывается путём разбиения времени на маленькие кусочки, в течение которых тело движется. Чем меньше каждый кусок, тем точнее и глаже будет нарисованная траектория. Перед каждым перемещением тела заново высчитываются все влияющие на него силы, тем самым получая действующее на него ускорение. Но вроде бы это из физики девятого класса (в моё время было).

У кого есть радиусы и массы планет, Солнца и радиусы орбит? O:-) О, у википедии.

Я чуть изменю задачу. Тело будет лететь с одной и той же стороны, только масса и скорость будут разные, зато положения планет будут произвольными.

Edited by Int
Link to comment
Share on other sites

  • 0
Сделать могу, но вот с визуализацией будут сложности B) Движущиеся планеты будет тяжело изобразить. А статичные довольно просто. Единственная сложность будет, если вектор входа в систему будет под углом к плоскости орбит планет. Тут пойдут и огромные расчёты и проекции при рисовании. Помню, в школе на паскале и не такое рисовали :lol:

О_оооооо, это что за школа такая? Для супер гениев? B)

Link to comment
Share on other sites

  • 0

Есть случайная расстановка планет на картинке :lol: Пойду кино погляжу, потом продолжу. Завтра даже скорее всего.

Не вижу ничего гениального, обычная геометрия. Проекции на плоскость строить умеешь? Я делаю двухмерный вариант, а то с трёхмерным возни слишком уж много, да и на статичной картинке будет смотреться не очень понятно.

Кому нужны задроты-математики, такие сидят на rsdn.ru +)

Edited by Int
Link to comment
Share on other sites

  • 0

Не знаю, что получилось, какие-то весьма странные результаты, пришлось в паре мест сильно ушаманить, но всё равно ничего не изменилось. Короче, вот:

<?
define('pi','3.1415926'); //Число пи, очевидно
define('Earth_mass',5.9736e24); //Масса Земли, кг
define('Earth_radius',6371000);
define('G',6.673e-11*Earth_mass/pow(Earth_radius,2)); //Гравитационная постоянная, пересчитанная в массы Земли и астрономические единицы
define('dt',0.0002); //Относительный элементарный отрезок времени (чем меньше, тем больше инераций цикла будет рассчитано)
$ix=800;
$iy=800;

$radius_mult=15; //Коэффициент для радиусов планет
$orbit_mult=60; //Коэффициент для радиусов орбит

//Дальше все величины идут относительные (по отношению к земным)
//$orbit=array(0,0.38,0.72,1.0,1.52,5.20,9.54,19.22,30.06); //Астрономические радиусы орбит
//$radius=array(109,0.382,0.949,1.0,0.53,11.2,9.41,3.98,3.81); //Астрономические радиусы планет и Солнца
//$masses=array(332946,0.06,0.82,1.0,0.11,318,95,14.6,17.2); //Реальные массы планет и Солнца

$orbit=array(0,0.40,0.72,1.0,1.52,2.20,3.31,4.22,6.15); //Адаптированные радиусы орбит
$radius=array(2.5,0.382,0.949,1.0,0.53,2.2,1.41,1.98,1.81); //Адаптированные радиусы планет
$masses=array(332946,0.06,0.82,1.0,0.11,318,95,14.6,17.2); //Адаптированные массы планет
$alphas=array(); //Угловые отклонения планет от нуля
for ($i=0; $i < sizeof($masses); $i++) $alphas[]=mt_rand(0,359)*pi/180; //Случайное угловое смещение планеты в радианах

//Характеристики влетающего тела
$p_radius=0.5; //Радиус
$p_mass=0.5; //Масса
$p_x0=round($ix-$ix/80); //Начальные координаты
$p_y0=round($iy/20+mt_rand(1,$iy/10));
$v0=mt_rand(1,400); //Скаляр вектора начальной скорости
$va=mt_rand(91,219)*pi/180; //Угол, под которым влетает тело (центр координат - в центре тела, а не в Солнце)

$im=imagecreatetruecolor($ix,$iy);
$fill=imagecolorallocate($im,230,255,230);
$black=imagecolorallocate($im,0,0,0); //Чёрный, для всего
$venus=imagecolorallocate($im,80,200,150);
$earth=imagecolorallocate($im,50,50,200);
$mars=imagecolorallocate($im,250,80,80);
$saturn=imagecolorallocate($im,80,60,20);
$uran=imagecolorallocate($im,200,200,200);
$neptun=imagecolorallocate($im,20,140,140);
$sun=imagecolorallocate($im,230,230,90); //Цвет Солнца
$obj=imagecolorallocate($im,40,40,210); //Цвет летящего тела
$trace=imagecolorallocate($im,140,100,100);

//Цвета планет
$colors=array($sun,$black,$venus,$earth,$mars,$black,$saturn,$uran,$neptun);

imagefill($im,0,0,$fill);

//Рисуем Солнце и планеты
for ($n=0;$n < sizeof($orbit); $n++)
{
$color=$colors[$n]; //цвет планеты
$plan_alpha=$alphas[$n]; //Случайное угловое смещение планеты в радианах
$plan_x=round($ix/2+$orbit[$n]*cos($plan_alpha)*$orbit_mult);
$plan_y=round($iy/2+$orbit[$n]*sin($plan_alpha)*$orbit_mult);
$plan_radius=round($radius_mult*$radius[$n]); //Радиус планет (одинаков по обоим направлениям)
imagefilledellipse($im,$plan_x,$plan_y,$plan_radius,$plan_radius,$color);
}


$iter=5/dt; //Число итераций цикла
$x=$p_x0; //Первоначальный расчёт координат начиается из начальной точки тела
$y=$p_y0;
$vx=$v0*cos($va); //Состаляющие начальной скорости
$vy=$v0*sin($va);

for ($f=0; $f < $iter; $f++) //Расчёт движения
{
$p_orbit=sqrt(pow($x-$ix/2,2)+pow($y-$iy/2,2))/$orbit_mult; //Расстояние от Солнца до тела
//Угол отклонения тела от нулевого направления относительно Солнца
//Лучшего метода расчёта что-то не смог найти
if (($x >= $ix/2) && ($y <= $iy/2)) //Первая четверть
{
if ($iy/2 != $y) $p_alpha=atan(($x-$ix/2)/($iy/2-$y));
else $p_alpha=pi/2;
}
elseif (($x > $ix/2) && ($y > $iy/2)) //Вторая четверть
$p_alpha=pi/2-atan(($x-$ix/2)/($y-$iy/2));
elseif (($x <= $ix/2) && ($y >= $iy/2)) //Третья четверть
{
if ($iy/2 != $y) $p_alpha=pi+atan(($ix/2-$x)/($y-$iy/2));
else $p_alpha=3*pi/2;
}
else //Четвёртая четверть
$p_alpha=2*pi-atan(($ix/2-$x)/($iy/2-$iy));

$Fx=$Fy=0; //Составляющие равнодействующей сил всех планет и Солнца
for ($n=0; $n < sizeof($masses); $n++)
{
//Расстояние между очередной планетой и телом (по теореме косинусов)
$dR=sqrt(pow($p_orbit,2)+pow($orbit[$n],2)-2*$orbit[$n]*$p_orbit*cos($p_alpha-$alphas[$n]));
$F=G*$p_mass*$masses[$n]/($dR*$dR); //Величина вектора силы
//Угол вектора силы от горизонтали (на картинке), находим по теореме синусов
if ($n != 0)
$angle=$p_alpha-asin($orbit[$n]*sin($alphas[$n]-$p_alpha)/$dR);
else //Для СОлнца посчитаем отдельно, а то какой-то косяк выходит
$angle=2*pi+$p_alpha;
$dFx=-$F*cos($angle);
$dFy=$F*sin($angle);
$Fx+=$dFx;
$Fy+=$dFy;
}
//На этом этапе у нас есть проекции сил, известна скорость тела к данному моменту времени и его координаты. Двигаем тело с ускорением в течение времени dt
$ax=$Fx/$p_mass; //Ускорение, сообщаемое телу системой планет
$ay=$Fy/$p_mass;
$x+=$vx*dt+$ax*dt*dt/2; //А вот и новые координаты
$y+=$vy*dt+$ay*dt*dt/2;

$vx+=$ax*dt; //Скорость изменилась под действием ускорения
$vy+=$ay*dt;
imagefilledellipse($im,$x,$y,1,1,$trace); //Отрисовали промежуточную точку траектории
}
imagefilledellipse($im,$p_x0,$p_y0,$p_radius*$radius_mult,$p_radius*$radius_mult,$obj);
imagerectangle($im,0,0,$ix-1,$iy-1,$black);

header('Content-type: image/gif');
imagegif($im);
imagedestroy($im);
?>

Edited by Int
Link to comment
Share on other sites

  • 0
Не знаю, что получилось, какие-то весьма странные результаты, пришлось в паре мест сильно ушаманить, но всё равно ничего не изменилось. Короче, вот:

<?
define('pi','3.1415926'); //Число пи, очевидно
define('Earth_mass',5.9736e24); //Масса Земли, кг
define('Earth_radius',6371000);
define('G',6.673e-11*Earth_mass/pow(Earth_radius,2)); //Гравитационная постоянная, пересчитанная в массы Земли и астрономические единицы
define('dt',0.0002); //Относительный элементарный отрезок времени (чем меньше, тем больше инераций цикла будет рассчитано)
$ix=800;
$iy=800;

$radius_mult=15; //Коэффициент для радиусов планет
$orbit_mult=60; //Коэффициент для радиусов орбит

//Дальше все величины идут относительные (по отношению к земным)
//$orbit=array(0,0.38,0.72,1.0,1.52,5.20,9.54,19.22,30.06); //Астрономические радиусы орбит
//$radius=array(109,0.382,0.949,1.0,0.53,11.2,9.41,3.98,3.81); //Астрономические радиусы планет и Солнца
//$masses=array(332946,0.06,0.82,1.0,0.11,318,95,14.6,17.2); //Реальные массы планет и Солнца

$orbit=array(0,0.40,0.72,1.0,1.52,2.20,3.31,4.22,6.15); //Адаптированные радиусы орбит
$radius=array(2.5,0.382,0.949,1.0,0.53,2.2,1.41,1.98,1.81); //Адаптированные радиусы планет
$masses=array(332946,0.06,0.82,1.0,0.11,318,95,14.6,17.2); //Адаптированные массы планет
$alphas=array(); //Угловые отклонения планет от нуля
for ($i=0; $i < sizeof($masses); $i++) $alphas[]=mt_rand(0,359)*pi/180; //Случайное угловое смещение планеты в радианах

//Характеристики влетающего тела
$p_radius=0.5; //Радиус
$p_mass=0.5; //Масса
$p_x0=round($ix-$ix/80); //Начальные координаты
$p_y0=round($iy/20+mt_rand(1,$iy/10));
$v0=mt_rand(1,400); //Скаляр вектора начальной скорости
$va=mt_rand(91,219)*pi/180; //Угол, под которым влетает тело (центр координат - в центре тела, а не в Солнце)

$im=imagecreatetruecolor($ix,$iy);
$fill=imagecolorallocate($im,230,255,230);
$black=imagecolorallocate($im,0,0,0); //Чёрный, для всего
$venus=imagecolorallocate($im,80,200,150);
$earth=imagecolorallocate($im,50,50,200);
$mars=imagecolorallocate($im,250,80,80);
$saturn=imagecolorallocate($im,80,60,20);
$uran=imagecolorallocate($im,200,200,200);
$neptun=imagecolorallocate($im,20,140,140);
$sun=imagecolorallocate($im,230,230,90); //Цвет Солнца
$obj=imagecolorallocate($im,40,40,210); //Цвет летящего тела
$trace=imagecolorallocate($im,140,100,100);

//Цвета планет
$colors=array($sun,$black,$venus,$earth,$mars,$black,$saturn,$uran,$neptun);

imagefill($im,0,0,$fill);

//Рисуем Солнце и планеты
for ($n=0;$n < sizeof($orbit); $n++)
{
$color=$colors[$n]; //цвет планеты
$plan_alpha=$alphas[$n]; //Случайное угловое смещение планеты в радианах
$plan_x=round($ix/2+$orbit[$n]*cos($plan_alpha)*$orbit_mult);
$plan_y=round($iy/2+$orbit[$n]*sin($plan_alpha)*$orbit_mult);
$plan_radius=round($radius_mult*$radius[$n]); //Радиус планет (одинаков по обоим направлениям)
imagefilledellipse($im,$plan_x,$plan_y,$plan_radius,$plan_radius,$color);
}


$iter=5/dt; //Число итераций цикла
$x=$p_x0; //Первоначальный расчёт координат начиается из начальной точки тела
$y=$p_y0;
$vx=$v0*cos($va); //Состаляющие начальной скорости
$vy=$v0*sin($va);

for ($f=0; $f < $iter; $f++) //Рассчёт движения
{
$p_orbit=sqrt(pow($x-$ix/2,2)+pow($y-$iy/2,2))/$orbit_mult; //Расстояние от Солнца до тела
//Угол отклонения тела от нулевого направления относительно Солнца
//Лучшего метода расчёта что-то не смог найти
if (($x >= $ix/2) && ($y <= $iy/2)) //Первая четверть
{
if ($iy/2 != $y) $p_alpha=atan(($x-$ix/2)/($iy/2-$y));
else $p_alpha=pi/2;
}
elseif (($x > $ix/2) && ($y > $iy/2)) //Вторая четверть
$p_alpha=pi/2-atan(($x-$ix/2)/($y-$iy/2));
elseif (($x <= $ix/2) && ($y >= $iy/2)) //Третья четверть
{
if ($iy/2 != $y) $p_alpha=pi+atan(($ix/2-$x)/($y-$iy/2));
else $p_alpha=3*pi/2;
}
else //Четвёртая четверть
$p_alpha=2*pi-atan(($ix/2-$x)/($iy/2-$iy));

$Fx=$Fy=0; //Составляющие равнодействующей сил всех планет и Солнца
for ($n=0; $n < sizeof($masses); $n++)
{
//Расстояние между очередной планетой и телом (по теореме косинусов)
$dR=sqrt(pow($p_orbit,2)+pow($orbit[$n],2)-2*$orbit[$n]*$p_orbit*cos($p_alpha-$alphas[$n]));
$F=G*$p_mass*$masses[$n]/($dR*$dR); //Величина вектора силы
//Угол вектора силы от горизонтали (на картинке), находим по теореме синусов
if ($n != 0)
$angle=$p_alpha-asin($orbit[$n]*sin($alphas[$n]-$p_alpha)/$dR);
else //Для СОлнца посчитаем отдельно, а то какой-то косяк выходит
$angle=2*pi+$p_alpha;
$dFx=-$F*cos($angle);
$dFy=$F*sin($angle);
$Fx+=$dFx;
$Fy+=$dFy;
}
//На этом этапе у нас есть проекции сил, известна скорость тела к данному моменту времени и его координаты. Двигаем тело с ускорением в течение времени dt
$ax=$Fx/$p_mass; //Ускорение, сообщаемое телу системой планет
$ay=$Fy/$p_mass;
$x+=$vx*dt+$ax*dt*dt/2; //А вот и новые координаты
$y+=$vy*dt+$ay*dt*dt/2;

$vx+=$ax*dt; //Скорость изменилась под действием ускорения
$vy+=$ay*dt;
imagefilledellipse($im,$x,$y,1,1,$trace); //Отрисовали промежуточную точку траектории
}
imagefilledellipse($im,$p_x0,$p_y0,$p_radius*$radius_mult,$p_radius*$radius_mult,$obj);
imagerectangle($im,0,0,$ix-1,$iy-1,$black);

header('Content-type: image/gif');
imagegif($im);
imagedestroy($im);
?>

Вот что получилось: http://floomby.ru/content/j2wSd414UK/

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy