[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: рандомный генератор отличающихся чисел
tvix
подскажите как вывести 3 отличающихся друг от друга числа рандомных в диапазоне от 1 до 8???



Спустя 5 минут, 28 секунд (2.02.2012 - 14:40) sergeiss написал(а):
1. Сгенерировать одно случайное число. Записать в массив.
2. Сгенерировать другое случайное число.
3. Если числа из п.2 еще нет в массиве, то записать в массив.
4. Если размер массива достаточен, то завершить набор данных, иначе - перейти к п.2.

Где-то так...

Спустя 3 минуты, 3 секунды (2.02.2012 - 14:43) twin написал(а):
    $a = range(1, 8);
shuffle($a);
$b = array_slice($a, 5);
echo implode(',', $b);

Спустя 12 минут, 17 секунд (2.02.2012 - 14:55) Игорь_Vasinsky написал(а):
$allDigits = array();

for($i=0; $i<30; $i++)
{
$digit = rand(1,8);
if(!in_array($digit, $allDigits))
$allDigits[] = $digit;

if(sizeof($allDigits) == 3)
break;
}

echo '<pre>' . print_r($allDigits, 1) . '</pre>';


:huh:

Спустя 3 минуты, 16 секунд (2.02.2012 - 14:59) nugle написал(а):
а почему for ? почему бы не вставлять значение массива до тех пор, пока исчезнут совпадения? может все через while лучше?

Спустя 2 минуты, 34 секунды (2.02.2012 - 15:01) Игорь_Vasinsky написал(а):
:D :lol:

<?php
$s = microtime(1);

$allDigits = array();

for($i=0; $i<30; $i++)
{
$digit = rand(1,8);
if(!in_array($digit, $allDigits))
$allDigits[] = $digit;

if(sizeof($allDigits) == 3)
break;
}

$e = microtime(1);
//Время
echo $e-$s.'<br/>';

echo '<pre>' . print_r($allDigits, 1) . '</pre>';


$s = microtime(1);
$a = range(1, 8);
shuffle($a);
$b = array_slice($a, 5);

$e = microtime(1);
//Время
echo $e-$s.'<br/>';

echo implode(',', $b);
?>



Мой код - 1.5974044799805E-5
Array
(
[0] => 4
[1] => 6
[2] => 3
)

Твин - 5.9604644775391E-6
7,2,8



:P

Спустя 12 минут, 41 секунда (2.02.2012 - 15:14) tvix написал(а):
спсибо!!!

Спустя 36 секунд (2.02.2012 - 15:15) Игорь_Vasinsky написал(а):
погоди.всё тока начинается wink.gif

Спустя 1 минута, 7 секунд (2.02.2012 - 15:16) twin написал(а):
У меня так твой отработал
Цитата
5.793571472168E-5

Array
(
    [0] => 5
    [1] => 8
    [2] => 3
)

2.288818359375E-5
1,6,3
и чё? Мерять нужно в цикле.

Спустя 53 секунды (2.02.2012 - 15:17) neadekvat написал(а):
Игорь_Vasinsky, для вывода времени используй printf:
$start_time = microtime(1);
// code
printf('%.6f', microtime(1) - $start_time);

Меня точность до шести знаков устраивает, а там уж как кому удобнее.

Спустя 1 минута, 34 секунды (2.02.2012 - 15:18) nugle написал(а):
мне кажется так вернее будет
<?php
$s = microtime(1);

$allDigits2 = array();

for($i=0; $i<3; $i++)
{
$size1 = sizeof($allDigits2);
$size2 = sizeof($allDigits2);

while($size2 != $size1 + 1)
{
$n = rand(1,8);
if(!in_array($n, $allDigits2))
$allDigits2[] = $n;
else
$n = rand(1,8);
$size2 = sizeof($allDigits2);
}
}



$e = microtime(1);
echo $e - $s;

var_dump($allDigits2);

Спустя 34 секунды (2.02.2012 - 15:19) Игорь_Vasinsky написал(а):
Цитата
Мерять нужно в цикле.

для чё? цикл закончиться как массив наберёт 3 элемента - вывел время со старта и до формирования массива. зачем мне в цикле?

Спустя 1 минута, 52 секунды (2.02.2012 - 15:21) neadekvat написал(а):
Мой вариант:
$min = 1;
$max = 8;
$count = 3;

$arr = array();
while(1)
{
$num = rand($min, $max);

if ( ! in_array($num, $arr))
$arr[] = $num;

if (count($arr) == $count)
break;
}

print_r($arr);



Или так:
$min = 1;
$max = 8;
$count = 3;

$arr = array();
while(count($arr) != $count)
{
$num = rand($min, $max);

if ( ! in_array($num, $arr))
$arr[] = $num;
}

print_r($arr);

Спустя 2 минуты, 50 секунд (2.02.2012 - 15:23) twin написал(а):
Я имею ввиду, что код нужно повторить раз 1000. В цикле. Тогда будет примерная картина. А ты меряешь всего один запуск. Погрешность такова, что ничего ты не узнаешь.

Вообще я не люблю грязный код. Пусть не 30, пусть 3000 ты поставишь. Это все равно грязно. Ничтожная вероятность того, что не получится 3 чисел все равно существует. А это уже непрофессионально.

neadekvat
Зачем бесконечный цикл то?)) Есть же do... while

Спустя 1 минута (2.02.2012 - 15:24) neadekvat написал(а):
Цитата (twin @ 2.02.2012 - 16:23)
Зачем бесконечный цикл то?)) Есть же do... while

А можно и do...while.
Но у меня один хрен быстрее - потому что кода меньше smile.gif

Спустя 1 минута, 16 секунд (2.02.2012 - 15:26) Игорь_Vasinsky написал(а):
я -0.000071
Array
(
[0] => 2
[1] => 7
[2] => 5
)
твин -0.000006
Array
(
[0] => 7
[1] => 3
[2] => 1
)
nugle -0.000010
Array
(
[0] => 4
[1] => 7
[2] => 5
)



<?php
//Я
$s = microtime(1);

$allDigits = array();

for($i=0; $i<30; $i++)
{
$digit = rand(1,8);
if(!in_array($digit, $allDigits))
$allDigits[] = $digit;

if(sizeof($allDigits) == 3)
break;
}

$e = microtime(1);

printf('%.6f', microtime(1) - $s).'<br />';

echo '<pre>' . print_r($allDigits, 1) . '</pre>';

//Twin
$s = microtime(1);

$a = range(1, 8);
shuffle($a);
$b = array_slice($a, 5);

printf('%.6f', microtime(1) - $s).'<br />';

echo '<pre>' . print_r($b, 1) . '</pre>';


//Nugle
$s = microtime(1);

$allDigits2 = array();

for($i=0; $i<3; $i++)
{
$size1 = sizeof($allDigits2);
$size2 = sizeof($allDigits2);

while($size2 != $size1 + 1)
{
$n = rand(1,8);
if(!in_array($n, $allDigits2))
$allDigits2[] = $n;
else
$n = rand(1,8);
$size2 = sizeof($allDigits2);
}
}


printf('%.6f', microtime(1) - $s).'<br />';

echo '<pre>' . print_r($allDigits2, 1) . '</pre>';

?>



всё равно быстрей ;)


neadekvat
не поверишь вообще не юзал printf('%.6f', .... вообще :D



твин я проверил 10 раз - картина (отрыв) похожий.





Цитата
вообще я не люблю грязный код. Пусть не 30, пусть 3000 ты поставишь. Это все равно грязно. Ничтожная вероятность того, что не получится 3 чисел все равно существует. А это уже непрофессионально.


а чем он грязен? тем что быстрее работает? всё. не завидуй. дорогу молодёже!

Спустя 1 минута, 32 секунды (2.02.2012 - 15:27) neadekvat написал(а):
Цитата (Игорь_Vasinsky @ 2.02.2012 - 16:26)
а чем он грязен? тем что быстрее работает?

Нет, тем, что у тебя с потолка взято число 30.

Спустя 6 минут, 5 секунд (2.02.2012 - 15:33) Игорь_Vasinsky написал(а):
почему - я - создовая алгортм для своего кода - не смогу взять этуц 30ку для условия? считай эту переменная высчитанная из теории вераятности с расчётом вероятности повтора 3*10 (не обаснованно). я бы увеличилд для этого интервала бы до 100 (тоже с потолка) - для своего алгоритма.

Спустя 4 минуты, 25 секунд (2.02.2012 - 15:38) Игорь_Vasinsky написал(а):
торможу

Спустя 7 минут, 1 секунда (2.02.2012 - 15:45) sergeiss написал(а):
...ждём-с версию с классами и полноценным ООП... wink.gif

Спустя 1 минута, 7 секунд (2.02.2012 - 15:46) Игорь_Vasinsky написал(а):
Свернутый текст
так не честно


Спустя 17 минут, 55 секунд (2.02.2012 - 16:04) twin написал(а):
Игорь_Vasinsky
Ты не понял. Нельзя мерять один запуск. Нужно мерять 1000 или 10000. Только тогда будет картина. Вот такая:
Цитата
twin: 0.153170
Игорь_Vasinsky: 0.432071
nugle: 0.707807
neadekvat: 0.455379


А вот тест, если интересно:

<?php
$start_time = microtime(1);

for($j = 0; $j < 10000; ++$j)
{
$a = range(1, 8);
shuffle($a);
$b = array_slice($a, 5);

}

printf('twin: %.6f<br>', microtime(1) - $start_time);

$start_time = microtime(1);

for($j = 0; $j < 10000; ++$j)
{
$allDigits = array();

for($i=0; $i<30; $i++)
{
$digit = rand(1,8);
if(!in_array($digit, $allDigits))
$allDigits[] = $digit;

if(sizeof($allDigits) == 3)
break;
}

}


printf('Игорь_Vasinsky: %.6f<br>', microtime(1) - $start_time);

$start_time = microtime(1);

for($j = 0; $j < 10000; ++$j)
{
$allDigits2 = array();

for($i=0; $i<3; $i++)
{
$size1 = sizeof($allDigits2);
$size2 = sizeof($allDigits2);

while($size2 != $size1 + 1)
{
$n = rand(1,8);
if(!in_array($n, $allDigits2))
$allDigits2[] = $n;
else
$n = rand(1,8);
$size2 = sizeof($allDigits2);
}
}

}


printf('nugle: %.6f<br>', microtime(1) - $start_time);

$start_time = microtime(1);

for($j = 0; $j < 10000; ++$j)
{
$min = 1;
$max = 8;
$count = 3;

$arr = array();
while(count($arr) != $count)
{
$num = rand($min, $max);

if ( ! in_array($num, $arr))
$arr[] = $num;
}

}


printf('neadekvat: %.6f<br>', microtime(1) - $start_time);



Спустя 1 минута, 39 секунд (2.02.2012 - 16:05) nugle написал(а):
Игорь_Vasinsky
тут вероятность не 1/10, а 1/8

Спустя 5 минут, 4 секунды (2.02.2012 - 16:11) Игорь_Vasinsky написал(а):
nugle
я предномеренно увеличил (с запасом)


Лан... бронза... эх,

twin: 0.026475
neadekvat: 0.042067
Vasinsky: 0.045620
nugle: 0.063306

Спустя 5 минут, 1 секунда (2.02.2012 - 16:16) neadekvat написал(а):
Цитата (Игорь_Vasinsky @ 2.02.2012 - 16:33)
считай эту переменная высчитанная из теории вераятности

Без обид, но если бы действительно ее знал, то не назвал бы "теория вероятности" в то время, как это "теория вероятностей". К тому же, она много сложнее, чем ты изложил.
И последнее - теория вероятностей может использоваться для придания элементов искусственного интеллекта своему коду, но никак не для подсчета необходимого количества итерация в счетчике, который предназначен для других задач. Т.е. ты использовал не тот инструмент.


Спустя 1 минута, 45 секунд (2.02.2012 - 16:17) twin написал(а):
Игорь_Vasinsky
нифа у тебя тачка....
Свернутый текст
Ушел в магазин за железом. smile.gif

Спустя 14 минут, 35 секунд (2.02.2012 - 16:32) inpost написал(а):
twin: 0.016278
neadekvat: 0.023078
Игорь_Vasinsky: 0.025218
nugle: 0.036619

Спустя 13 секунд (2.02.2012 - 16:32) TMake написал(а):
sergeiss
по твоей просьбе :lol:
Свернутый текст

Цитата
0.000122
ObjQ Object
(
    [_result:ObjQ:private] => Array
        (
            [0] => 7
            [1] => 4
            [2] => 6
        )

)


class RandNum{
private static $_var = false;

public static function obj(){
if(!self::$_var)
self::$_var = new ObjQ();
return self::$_var;
}

public function getArr(){
return range(1, 8);
}
}


class ObjQ extends RandNum{
private $_result = array();

public function __construct(){
for($i = 0; $i < 3; $i++)
$this->shufflePop($this->getArr());
return $this->_result;
}

private function shufflePop($array){
shuffle($array);
$this->_result[] = array_pop($array);
}
}


$s = microtime(1);

$var = RandNum::obj();

printf('%.6f', microtime(1) - $s).'<br />';
echo '<pre>' . print_r($var, 1) . '</pre>';


Спустя 23 минуты, 40 секунд (2.02.2012 - 16:56) twin написал(а):
stepan
А ссылка в синглтоне зачем?

Спустя 4 минуты, 1 секунда (2.02.2012 - 17:00) TMake написал(а):
Цитата (twin @ 2.02.2012 - 17:56)
А ссылка в синглтоне зачем?

да тупанул не туда пхнул ее

Спустя 2 минуты, 23 секунды (2.02.2012 - 17:02) TMake написал(а):
там ссылка вообще не кместу

Спустя 9 минут, 25 секунд (2.02.2012 - 17:12) sergeiss написал(а):
Цитата (stepan @ 2.02.2012 - 17:32)
sergeiss
по твоей просьбе

Не... Не годиЦЦа! smile.gif А где возможность настройки количества возвращаемых чисел и диапазона рандомности?
"Ну я так не играю!" (с) Карлсон smile.gif

Спустя 3 минуты, 17 секунд (2.02.2012 - 17:15) TMake написал(а):
sergeiss ну ты же не сказал в каком виде тебе это нужно, домой приду зделаю если ни кто не опередит, да в принципе какая разница сделаю - бегемотика из мухи biggrin.gif

Спустя 23 минуты, 13 секунд (2.02.2012 - 17:38) Игорь_Vasinsky написал(а):
Цитата
нифа у тебя тачка....

да эт DELL с i3 тока))

Спустя 18 минут, 19 секунд (2.02.2012 - 17:56) nugle написал(а):
Игорь_Vasinsky
ты цикл на 10000 ставил?

Спустя 1 минута, 14 секунд (2.02.2012 - 17:58) Игорь_Vasinsky написал(а):
ну твиновский, со 2й страницы - без именений скопипастил...

не стал ни чё проверять, твина то давно знаю biggrin.gif

Спустя 3 минуты, 57 секунд (2.02.2012 - 18:02) nugle написал(а):
моя i7 и то в 2 раза меленнее

Спустя 1 минута, 59 секунд (2.02.2012 - 18:04) inpost написал(а):
nugle
У меня i5, я показал свои результаты ранее. И это ещё на самом медленном винчестере, а у меня их 3 smile.gif

Спустя 12 минут, 6 секунд (2.02.2012 - 18:16) nugle написал(а):
inpost
на хороший винт я еще не заработал) моему года 2) самый низкий показатель даёт среди всего железа)

Спустя 4 минуты, 35 секунд (2.02.2012 - 18:20) Игорь_Vasinsky написал(а):
гоню.. это на работе же комп...там не помню что....

мой i3 вот (правда фотошоп открыт и около 30 вкладок в хроме)

twin: 0.042215
Vasinsky: 0.070927
nugle: 0.100645
neadekvat: 0.062816

Спустя 2 часа, 11 минут, 22 секунды (2.02.2012 - 20:32) neadekvat написал(а):
Цитата
twin: 0.034532
Игорь_Vasinsky: 0.050512
nugle: 0.071272
neadekvat: 0.048830


Celeron, нах.

Спустя 29 минут, 52 секунды (2.02.2012 - 21:01) Игорь_Vasinsky написал(а):
Свернутый текст
да хоть калькулятор

Спустя 2 часа, 6 минут, 14 секунд (2.02.2012 - 23:08) TMake написал(а):
sergeiss как и обещал ;)

Цитата
0.000558
Array
(
    [0] => 12
    [1] => 4
    [2] => 19
    [3] => 7
    [4] => 18
)


/**
* Класс случайных чисел
*/

class RandNum{
private static $_var = false;
private $_rangeVar = array(1, 8);
private $_forVar = 3;

/**
* Синглатон объекта ObjQ
*
@return object
*/

public static function obj(){
if(!self::$_var)
self::$_var = new ObjQ();
return self::$_var;
}

/**
* Создание числового диапазона
*
@return array
*/

public function getArr(){
return range($this->_rangeVar[0], $this->_rangeVar[1]);
}

/**
* Установка промежутка
* числового диапазона
*
@param int $num_big начало диапазона
*
@param int $num_end конец диапазона
*
@return void
*/

public function setArr($num_big, $num_end){
$this->_rangeVar = array((int)$num_big, (int)$num_end);
}

/**
* Количество возвращаемых цифр
*
@return array
*/

public function getForVar(){
return $this->_forVar;
}

/**
* Установка количество возвращаемых цифр
*
@param int $num количество цифр
*
@return void
*/

public function setForVar($num){
$this->_forVar = (int)$num;
}
}


/**
* Модель случайных чисел
*/

class ObjQ extends RandNum{
private $_result = array();

/**
* Возвращение результата выполнения
*
@return array
*/

public function getResult(){
for($i = 0; $i < $this->getForVar(); $i++)
$this->shufflePop($this->getArr());
return $this->_result;
}

/**
* Перемешиваем и выводим последний символ массива
*
@param array $array массив чисел
*
@return void
*/

private function shufflePop($array){
shuffle($array);
$this->_result[] = array_pop($array);
}
}


$s = microtime(1);

$obj = RandNum::obj();
$obj->setForVar(5);
$obj->setArr(1, 20);
$var = $obj->getResult();

printf('%.6f', microtime(1) - $s).'<br />';
echo '<pre>' . print_r($var, 1) . '</pre>';

Спустя 3 часа, 41 секунда (3.02.2012 - 02:08) UnWind написал(а):
Етить твою за ногу) biggrin.gif
Даже и не знаю чем дополнить! sad.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.