Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2015, 18:06   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию Правильно ли сделал массив не повторяющихся случайных ip адресов

Например я хочу сделать массив ip адресов не повторяющихся.
Делаю так:
Код:
for($i = 0; $i <50; ++$i)
	{
	$tec_ip[0]=rand(0,255);
	$tec_ip[1]=rand(0,255);
	$tec_ip[2]=rand(0,255);
	$tec_ip[3]=rand(0,255);
		for($j = 0; $j <count($mas_str_ip); ++$j)
		{
		if (($tec_ip[0]==$mas_ip[$j][0])&($tec_ip[1]==$mas_ip[$j][1])&($tec_ip[2]==$mas_ip[$j][2])&($tec_ip[3]==$mas_ip[$j][3]))
			{
			--$i;
			}
		}
	$mas_ip[$i][0]=$tec_ip[0];
	$mas_ip[$i][1]=$tec_ip[1];
	$mas_ip[$i][2]=$tec_ip[2];
	$mas_ip[$i][3]=$tec_ip[3];
	$mas_str_ip[$i]=$tec_ip[0].'.'.$tec_ip[1].'.'.$tec_ip[2].'.'.$tec_ip[3];
	}
Вывел выглядит нормально, но действительно ли не могут одинаковые быть при таком алгоритме?

Последний раз редактировалось Illusiony; 21.01.2015 в 18:09.
Illusiony вне форума Ответить с цитированием
Старый 21.01.2015, 18:10   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Я бы не сказал что это правильно. Предидущие не проверяются. По крайней мере я такой проверки не вижу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.01.2015, 18:20   #3
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я бы не сказал что это правильно. Предидущие не проверяются. По крайней мере я такой проверки не вижу.
А разве конструкция:
Код:
for($j = 0; $j <count($mas_str_ip); ++$j)
		{
		if (($tec_ip[0]==$mas_ip[$j][0])&($tec_ip[1]==$mas_ip[$j][1])&($tec_ip[2]==$mas_ip[$j][2])&($tec_ip[3]==$mas_ip[$j][3]))
			{
			--$i;
			}
		}
не проверят на адреса которые уже были?
Возможно вы увидели вариант до моего редактирования.
Да неправильно во первых существует вероятность индекса -1, во вторых если нашли совпадение то затирается предыдущий элемент.
В общем ошибок много.
Кто посоветует как надо?

Последний раз редактировалось Illusiony; 21.01.2015 в 18:35.
Illusiony вне форума Ответить с цитированием
Старый 22.01.2015, 14:12   #4
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,714
По умолчанию

Цитата:
$tec_ip[0]=rand(0,255);
$tec_ip[1]=rand(0,255);
$tec_ip[2]=rand(0,255);
$tec_ip[3]=rand(0,255);
http://us1.php.net/manual/en/function.array.php
Цитата:
$mas_ip[$i][0]=$tec_ip[0];
$mas_ip[$i][1]=$tec_ip[1];
$mas_ip[$i][2]=$tec_ip[2];
$mas_ip[$i][3]=$tec_ip[3];
http://us1.php.net/manual/en/function.list.php

Цитата:
Кто посоветует как надо?
Код:
$res_ip=array();
$ip='';
for($i = 0; $i <50; $i++){
	do $ip=mt_rand(0,255).'.'.mt_rand(0,255).'.'.mt_rand(0,255).'.'.mt_rand(0,255); 
	while(array_search($ip,$res_ip)!==false);
	$res_ip[]=$ip;
}
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 22.01.2015, 14:24   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
не проверят на адреса которые уже были?
Странно... Или у меня что-то с глазами, или в топе был другой код...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2015, 14:41   #6
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,714
По умолчанию

Цитата:
Странно... Или у меня что-то с глазами, или в топе был другой код...
Не стоит лететь к окулисту.
Цитата:
Возможно вы увидели вариант до моего редактирования.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 22.01.2015, 17:18   #7
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

mv28jam. Большое спасибо.

А при вашем коде, когда встречается совпадение количество ip адресов в $res_ip в итоге не станет меньше 50?
Вроде количество ip не уменьшается. Проверил на 5000 значениях. Значит все нормально.

Последний раз редактировалось Illusiony; 22.01.2015 в 17:31.
Illusiony вне форума Ответить с цитированием
Старый 22.01.2015, 17:51   #8
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,714
По умолчанию

Цитата:
А при вашем коде, когда встречается совпадение количество ip адресов в $res_ip в итоге не станет меньше 50?
Код:
do $ip=mt_rand(0,255).'.'.mt_rand(0,255).'.'.mt_rand(0,255).'.'.mt_rand(0,255); 
while(array_search($ip,$res_ip)!==false);
Цитата:
Проверил на 5000 значениях. Значит все нормально.
Ненормально.
Количество вариантов 2 в 32 степени. Какова вероятность повтора на выборке в 5000?
Стрелок-охотник

Последний раз редактировалось mv28jam; 22.01.2015 в 17:54. Причина: слитно раздельно
mv28jam вне форума Ответить с цитированием
Старый 22.01.2015, 18:37   #9
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Но тут загвоздка при больших количествах ip. При более 20000 вероятность повторов достаточно велика и фактически вероятность бесконечно цикла очень велика.
Т.е. Находит совпадение генерирует новое проверяет если совпал опять новое генерирует. Но это особенность не самого скрипта, а логики поставленной задачи.
Через несколько минут 50000 отработало
Illusiony вне форума Ответить с цитированием
Старый 22.01.2015, 19:27   #10
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,714
По умолчанию

Цитата:
20000 ... очень велика
Да ну?!
Посчитайте сами и скажите велико ли http://www.math.by/probability/bernoulli.html ?
Вероятность выпаденя конкретного ip 1/4 294 967 296.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создать графический редактор в лазарусе!половину сделал а дальше никак не могу( кнопки все всё правильно сделал,а все равно не раб soso1 Помощь студентам 2 24.10.2013 17:05
Вывод случайных не повторяющихся чисел в Stringgrid Heng Помощь студентам 12 07.10.2012 16:59
Правильно ли сделал? cargo29 PHP 6 06.10.2011 17:09
правильно ли я сделал pinch000 Общие вопросы C/C++ 0 29.10.2009 00:54