Не знаю как другие, но у меня такое бывает - когда делать нечего начинаю проворачивать в голове какие-нить алгоритмы. Вот, например, как этот:
Код:
function rand_mas()
{
$k=array (5);
$k[0]=rand(1,5);
for ($i=1;$i<5;$i++)
{
$k[$i]=rand(1,5);
for ($m=0;$m<$i;$m++)
if ($k[$i]==$k[$m])
while ($k[$i]==$k[$m]) {$k[$i]=rand(1,5);}
}
for ($i=0;$i<5;$i++) echo "$k[$i]<br>";
}
rand_mas();
Как вы поняли, это простенький алгоритм создания одномерного массива неповторяющихся чисел ("размышлять" о двух- и более мерном без записей уже как-то не так интересно). Так вот. Тут есть маленькая ошибка, но из-за неё массив будет с повторами. Кто нашёл какая? . Предлагайте также свои небольшие алгоритмы, всем ведь интересно будет
Да какая разница, не в том дело. Я специально не писал никаких левых функций, чтоб даже тем, кто не знает пхп было понятно о чём речь, т.к. говорю именно об алгоритме. А так можно было бы тупо использовать тот же shuffle() хотя бы. Так ты нашёл в чём там ошибка?
Последний раз редактировалось: Serg_HD (Вт Янв 23, 2007 20:56 pm), всего редактировалось 2 раз(а)
function rand_mas()
{
$k=array (5);
$k[0]=rand(1,5);
for ($i=1;$i<5;$i++)
{
$k[$i]=rand(1,5);
for ($m=0;$m<$i;$m++){
if ($k[$i]==$k[$m]){
while ($k[$i]==$k[$m]) {
$k[$i]=rand(1,5);
}
}
}
}
for ($i=0;$i<5;$i++) echo "$k[$i]<br>";
}
rand_mas();
Ладно, сам не люблю када от меня чего-то хотят, поэтому ограничусь лишь предложением. Ошибка была тут:
Код:
function rand_mas()
{
$k=array ();
$k[0]=rand(1,5);
for ($i=1;$i<5;$i++)
{
$k[$i]=rand(1,5);
for ($m=0;$m<$i;$m++)
if ($k[$i]==$k[$m])
while ($k[$i]==$k[$m]) {$k[$i]=rand(1,5);$m=0;}//добавлено $m=0; для обнуления цикла
}
for ($i=0;$i<5;$i++) echo "$k[$i]<br>";
}
rand_mas();
Ладно, сам не люблю када от меня чего-то хотят, поэтому ограничусь лишь предложением. Ошибка была тут:
Код:
function rand_mas()
{
$k=array ();
$k[0]=rand(1,5);
for ($i=1;$i<5;$i++)
{
$k[$i]=rand(1,5);
for ($m=0;$m<$i;$m++)
if ($k[$i]==$k[$m])
while ($k[$i]==$k[$m]) {$k[$i]=rand(1,5);$m=0;}//добавлено $m=0; для обнуления цикла
}
for ($i=0;$i<5;$i++) echo "$k[$i]<br>";
}
rand_mas();
В изначально корявом алгоритме ошибки лучше не искать, а переписать заново. У меня получилось проще и логичней
2Serg_HD Да я вообще не понимаю почему ты описывал алгоритм на РНР. Обычно все алгоритмы описывают либо на Паскале, либо на Си. Я не считаю удачным показывать алгоритм на РНР.
Соглашусь с Томасом, что приведенный код надо оформлять правильно с отступами и нормальными названиями переменных.
Предлагаю свой вариант (когда-то делал на С++ одногруппнику по просьбе), - по-моему так будет несколько быстрей, если я правильно понял, как работают ваши вышеописанные алгоритмы:
Код:
void Fill(int *b, int n) {
int i,j,t,*a=new int[n];
for (i=n; i--; )
a[i]=i+1;
for (i=n,j=0; i>1; )
b[j++]=a[t=random(i)],
a[t]=a[--i];
b[n-1]=a[0];
delete(a);
; }
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах