Генератор случайных datetime

whirlwind

TDD infected, paranoid
Генератор случайных datetime

Есть что нибудь готовое в природе? Главное что бы поддреживал генерацию в периоде.
 

Romantik

TeaM PHPClub
а чем мешает рандомить 3 числа в указанном периоде, складывать и проверять на корректность?
 

whirlwind

TDD infected, paranoid
>а чем мешает рандомить 3 числа в указанном периоде

ну если поглубже вникнуть в суть задачи, то станет ясно что все не так просто.

Меня так же устроит варант генератора больших случайных чисел (класс/алгоритм/etc).

-~{}~ 20.04.06 17:09:

>случайный unix timestamp чем не выход

getrandmax()
 

McSimm

Новичок
можно генерировать случайное смещение от начала периода

-~{}~ 20.04.06 17:12:

А если речь именно о датах, то генерировать можно смещение в днях, после чего умножить на количество секунд в сутках и прибавить к началу периода.
 

whirlwind

TDD infected, paranoid
> генерировать случайное смещение

в чем? в секундах?

в составляющих, то же самое
а чем мешает рандомить 3 числа в указанном периоде, складывать и проверять на корректность
промежуточные проверки геморойные получаются.

неужели нет ничего готового?
 

whirlwind

TDD infected, paranoid
Если кому понадобится, решил так в пределах timestamp-а
PHP:
	static public function randUINT($min=0,$max=0xFFFFFFFF){
		if ( $min < 0 || $min > 0xFFFFFFFF
			|| $max < 0 || $max > 0xFFFFFFFF
			|| $min > $max )
		{
			return null;
		}
		$min -= 0x80000000;
		$max -= 0x80000000;
		$randval = mt_rand($min,$max);
		return $randval + 0x80000000;
	}
 

clops

Новичок
кошмар!! ну разве сложно генерить случайный таймстамп?

PHP:
$start = mktime(0,0,0,2006,1,1);
$end  = time();
$randomStamp = rand($start,$end);
echo date('Y-m-d',$randomStamp);
-~{}~ 21.04.06 14:36:

а для тех кто будет задавать вопрос про getrandmax

PHP:
<?
    echo getrandmax();
    echo "<br />";
    echo time();
?>
выдаёт

2147483647
1145615741

что-то мне говорит что в запасе есть ещё несколько десятков лет ;))

-~{}~ 21.04.06 14:38:

ну а к вопросы об «очень больших случайных числах» — что мешает перемножить два «не очень больших» случайных числа?
 

clops

Новичок
а хостинг у вас тоже на IIS?

-~{}~ 21.04.06 14:43:

да и, более того, тут же и ответ на вопрос

« If you require a range larger than 32768, specifying min and max will allow you to create a range larger than RAND_MAX, or consider using mt_rand() instead.»
 

whirlwind

TDD infected, paranoid
>ну а к вопросы об «очень больших случайных числах» — что мешает перемножить два «не очень больших»

а попробовать?
 

McSimm

Новичок
clops
не надо так делать. распределение искажается, да и пользы никакой.

whirlwind
Теоретически на константу можно умножать, как я писал уже. период 32768 дней может хватить. хотя у вас уже есть нормальное решение, так что неважно.
 

whirlwind

TDD infected, paranoid
>Tеоретически на константу можно умножать

Вот я попробовал практически, и столкнулся с кучей граблей. Фишка в том, что cамо дополнение трудно вычислить. Если бы периоды всегда были выровнены по границы байта, то проблем бы не было. А если усекать старшую часть, то нарушается распределение, т.к. из всех возможных значений определенный промежуток становится недоступным.
 

clops

Новичок
лана-лана, случайную большую дату под виндовсами можно получить ещё вот так

PHP:
$randomTimestamp = mktime(0,0,0,rand(2006,2106),rand(1,31),rand(1,12));
чем такое не устраивает?
 

SelenIT

IT-лунатик :)
clops
...под виндовсами можно получить ещё вот...
Warning: mktime(): Windows does not support negative values for this function in...
whirlwind
промежуточные проверки геморойные
Отчего же? Разве
do { http://phpclub.ru/talk/showthread.php?postid=603555#post603555) while (![m]check_date[/m](этих_3-х_чисел));
не решает задачу гораздо шире диапазона timestamp'а?
 
Сверху