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

Пыха жаловалась, что до отдачи заголовков был какой-то вывод. Возможно, BOM-метка (если файл в utf-8 и сохранен в блокноте). Надо пересохранить в нормальном редакторе без BOM (на самый крайням — в блокноте в ANSI).

Link to comment
Share on other sites

  • 0
Пыха жаловалась, что до отдачи заголовков был какой-то вывод. Возможно, BOM-метка (если файл в utf-8 и сохранен в блокноте). Надо пересохранить в нормальном редакторе без BOM (на самый крайням — в блокноте в ANSI).

Все понятно :lol:

Сохрани файл в utf-8 без BOM или в ANSI, в этом как раз и проблема

А настройки пыха тут не причем

Link to comment
Share on other sites

  • 0

Эээ. Ты же не думаешь это сдавать? :lol:)

К тому же, тут Солнце себя неадекватно ведёт, похоже, что оно не притягивает, а отталкивает. А то и вовсе никак не действует, не хочется мне с этим разбираться. А может и не отталкивает, а просто неправильно притягивает во всех четвертях кроме первой.

Переделываю весь скрипт. Нашёл кучу ошибок. И масса влетающего тела тоже не нужна.

Edited by Int
Link to comment
Share on other sites

  • 0
Эээ. Ты же не думаешь это сдавать? :lol:)

К тому же, тут Солнце себя неадекватно ведёт, похоже, что оно не притягивает, а отталкивает. А то и вовсе никак не действует, не хочется мне с этим разбираться. А может и не отталкивает, а просто неправильно притягивает во всех четвертях кроме первой.

Нет. Конечно не буду. Мы ещё работу с изображениями не проходили.

Link to comment
Share on other sites

  • 0

Начало работать с одним Солнцем, нашёл пару очень грубых ошибок. Уже выходит на эллиптические орбиты.

Теперь буду добавлять планеты ;)

А где это в школе php проходят?

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

Link to comment
Share on other sites

  • 0

Мне кажется, что движение чего-то вокруг явного центра притяжения сам Кеплер велел рассчитывать в полярных координатах, а в декартовы преобразовывать уже на выходе, непосредственно при отрисовке. Все-таки основу траектории (эллипс/парабола/гипербола) явно Солнце задает, планеты лишь возмущения накладывают. Для начала с вполне приличной точностью, имхо, хватит Юпитера с Сатурном, остальное уйдет в погрешность. И, кстати, разве планеты все время движения этой кометы так и будут стоять как вкопанные? ;)

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); //Относительный элементарный отрезок времени (чем меньше, тем больше инераций цикла будет рассчитано)
define('axel_debug',0); //Константа включает отрисовку ускорений, используется для дебага
$ix=800;
$iy=800;

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

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

$orbit=array(0,0.38,0.72,1,1.52,2.90,3.54,4.22,6.06); //Адаптированные радиусы орбит
$radius=array(2,0.382,0.949,1,0.43,1.2,1.41,1.98,1.81); //Адаптированные радиусы планет
$masses=array(450,0.06,0.82,1,0.11,31,9,14.6,17.2); //Адаптированные массы планет
$alphas=array(); //Угловые отклонения планет от нуля
for ($i=0; $i < sizeof($masses); $i++)
$alphas[]=mt_rand(0,2*pi); //Случайное угловое смещение планеты в радианах

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

$im=imagecreatetruecolor($ix,$iy);
$fill=imagecolorallocate($im,230,255,230);
$black=imagecolorallocate($im,0,0,0); //Чёрный, для всего
$blue=imagecolorallocate($im,0,0,255);

$mercur=imagecolorallocate($im,50,50,200);
$earth=imagecolorallocate($im,100,200,250);
$venus=imagecolorallocate($im,80,200,150);
$mars=imagecolorallocate($im,250,80,80);
$saturn=imagecolorallocate($im,100,80,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,150,100,100);

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

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

//Рисуем Солнце и планеты
for ($n=0;$n < sizeof($masses); $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; //Расстояние от Солнца до тела
$ax=$ay=0; //Составляющие равнодействующей сил всех планет и Солнца
for ($n=0; $n < sizeof($masses); $n++)
{
$x0=$ix/2+$orbit[$n]*$orbit_mult*cos($alphas[$n]); //Экранное начало центра координат, от корого будем вести расчёт углов
$y0=$iy/2+$orbit[$n]*$orbit_mult*sin($alphas[$n]);
//Угол отклонения тела от нулевого направления относительно Солнца
//Лучшего метода расчёта что-то не смог найти
if ($x == $x0) $a=pi/2; //Тут арктангенс не определён поэтому делаем ручные расчёты
else $a=atan(($y-$y0)/($x-$x0)); //Угол отклонения от горизонтали силы, действующей на тело со стороны $n-й планеты

if ($x > $x0) $a=pi+$a; //Так нужно, см. геометрические расчёты

$dR=sqrt(pow($x-$x0,2)+pow($y-$y0,2))/$orbit_mult; //Расстояние между телом и планетой

$A=G*$masses[$n]/($dR*$dR); //Ускорение
$ax+=$A*cos($a);
$ay+=$A*sin($a);
}
if (axel_debug) imageline($im,$x,$y,$x+$ax/(0.1*$mass_mult),$y+$ay/(0.1*$mass_mult),$blue); //Рисуем ускорения
$x+=$vx*dt+$ax*dt*dt/2; //А вот и новые координаты
$y+=$vy*dt+$ay*dt*dt/2;
$vx+=$ax*dt; //Скорость изменилась под действием ускорения
$vy+=$ay*dt;
$point_r=1;
if (axel_debug) $point_r=2;
imagefilledellipse($im,$x,$y,$point_r,$point_r,$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://pic.rapidshare.ru/1238317

http://pic.rapidshare.ru/1238318

Edited by Int
Link to comment
Share on other sites

  • 0

Я уже два года как работаю ;) Синусы-то запомнить не сложно, а вот химия дольше месяца в голове не держится.

Ещё одна задача со случайными величинами:

Имеется стальная рельса толщины... ну 20 см. В неё стреляют 10 разными патронами, порядок которых выбираются случайно. У патронов разная масса, они абсолютно твёрдые и абсолютно гладкие. Посчитать, какой по счёту патрон (в среднем из 100 опытов) пробьёт рельсу насквозь. После каждого выстрела патроны из отверстия вынимаются.

Edited by Int
Link to comment
Share on other sites

  • 0
Я уже два года как работаю ;) Синусы-то запомнить не сложно, а вот химия дольше месяца в голове не держится.

Ещё одна задача со случайными величинами:

Имеется стальная рельса толщины... ну 20 см. В неё стреляют 10 разными патронами, порядок которых выбираются случайно. У патронов разная масса, они абсолютно твёрдые и абсолютно гладкие. Посчитать, какой по счёту патрон (в среднем из 100 опытов) пробьёт рельсу насквозь. После каждого выстрела патроны из отверстия вынимаются.

Абсолютно твердые и абсолютно гладкие - понятие растяжимое (особенно первое).

Тут еще нужна будет по ходу скорость с которой летит пуля, ее масса (уже указали), убойная сила (т.е. с какого расстояния какая убойная сила), ну и видимо сама "пушка" (так как все патроны разные и "пушки" тоже будут разными: гладкоствольные, винтовые, длина ствола (от которого зависит дальность полета и убойная сила)).

Вот как-то так...

Link to comment
Share on other sites

  • 0

Ну скорость - константа, пуля абсолютно гладкая, поэтому трения об атмосферу отсутствует => летит без замедления. Все пули вылетают с одной скоростью. Нечего усложнять задачу ;)

Абсолютно твёрдая - абсолютно упругое столкновение, вся энергия пули уходит в рельсу, пуля не деформируется. Щас набросаю, тут всё гораздо проще.

Да, все пули одинакового диаметра. А то лишние вычисления ни к чему.

—--

Чё-то косяк с задачей. Формулу продырявливания не знаю.

Ладно, другая задача:

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

Кубики крепятся слоем невесомого клея ПВА пренебрежимо малой толщины :(

Edited by Int
Link to comment
Share on other sites

  • 0
Каждый кубик может смещаться в пределах 0.2 м относительно предыдущего (влево-вправо, без разницы)

Есть разница, если один будет смещаться в лево, а следующий в право на 0.2 м - никогда не:

башня потеряет устойчивость
Link to comment
Share on other sites

  • 0
да, не потеряет, я это предусмотрел и ввёл ограничение в 1000 кубиков

Логичнее было бы сделать так:

Кубики смещаются хаотично (в лево, или в право) относительно предыдущего на 0.2м

Edited by rus
Link to comment
Share on other sites

  • 0

влево и вправо пишутся слитно.

Я думал, что если кубик может смещаться, то понятно, что он это делает

<?
define('border',1); //Длина ребра кубика
define('dx',0.2); //Разрешённое смещение от позиции предыдущего кубика

$results=array(); //Массив с номерами кубиков, на которых упала башня
for ($n=0; $n < 1000; $n++)
{
$iter=0; //Число прошедших итераций. На определённом шаге вырубаем, чтобы не попасть в бесконечный цикл
$kub=array(0); //Массив с координатами центров кубиков (координата одна)
$c_mass=0; //Координата центра масс (ноль - в центре первого кубика), она тут одна, потому что вертикальная нас не интересует
while (($c_mass <= border/2) && ($c_mass >= -border/2) && (++$iter <= 1000))
{
$kub[$iter]=$kub[$iter-1]+(mt_rand(0,200*dx)-100*dx)/100;
$c_mass=array_sum($kub)/sizeof($kub);
}
if ($iter < 1001) $results[]=$iter+1;
}
if (sizeof($results))
echo 'Среднее число кубиков, необходимых для обрушения башни: '.ceil(array_sum($results)/sizeof($results));
else echo 'Башня ни разу не рухнула';
?>

У меня среднее число кубиков крутится вокруг 120, а у вас?

Можно изменить задачу и сделать кубики кусочками лего из двух "ячеек". То есть они могут вставать всего в три позиции относительно нижнего.

Edited by Int
Link to comment
Share on other sites

  • 0
влево и вправо пишутся слитно.

Я думал, что если кубик может смещаться, то понятно, что он это делает

<?
define('border',1); //Длина ребра кубика
define('dx',0.2); //Разрешённое смещение от позиции предыдущего кубика

$results=array(); //Массив с номерами кубиков, на которых упала башня
for ($n=0; $n < 1000; $n++)
{
$iter=0; //Число прошедших итераций. На определённом шаге вырубаем, чтобы не попасть в бесконечный цикл
$kub=array(0); //Массив с координатами центров кубиков (координата одна)
$c_mass=0; //Координата центра масс (ноль - с центре первого кубика), она тут одна, потому что вертикальная нас не интересует
while (($c_mass <= border/2) && ($c_mass >= -border/2) && (++$iter <= 1000))
{
$kub[$iter]=$kub[$iter-1]+(mt_rand(0,200*dx)-100*dx)/100;
$c_mass=array_sum($kub)/sizeof($kub);
}
if ($iter < 1001) $results[]=$iter+1;
}
if (sizeof($results))
echo 'Среднее число кубиков, необходимых для обрушения башни: '.ceil(array_sum($results)/sizeof($results));
else echo 'Башня ни разу не рухнула';
?>

У меня среднее число кубиков крутится вокруг 120, а у вас?

Можно изменить задачу и сделать кубики - кусочками лего из двух "ячеек". То есть они могут вставать всего в три позиции относительно нижнего.

Скрипт не правильно работает. Даже при нулевом смешении "Среднее число кубиков, необходимых для обрушения башни: 2"

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