Сашун, Дата: 24 Мая 2001 15:18
****** А вот для пользы дела (успокоения параноиков) генератор префный было бы неплохо тут тиснуть. Без там адреса базы и прочих "секретов". Все его там строк 30. Посмотрели б его "со стороны". yurets (---.krasu.ru) Дата: 24 Мая 2001 16:12
ну держите :) РНР отличается немного от С, но любой программист при желании разберется
сначала сам датчик случайных чисел (ничего я тут не придумывал, все по науке, алгоритм Мерсенна), генерится случайное число из 32 бит
define("N", 624); define("M", 397); define("MATRIX_A", -1727483681); /* constant vector a */ define("UPPER_MASK", -2147483648); /* most significant w-r bits */ define("LOWER_MASK", 2147483647); /* least significant r bits */ $mti = N+1; $mag01 = array(0, MATRIX_A);
function mt_regen() { GLOBAL $mt, $mti, $mag01; for ($kk=0; $kk $y = ($mt[$kk]&UPPER_MASK)|($mt[$kk+1]&LOWER_MASK); $mt[$kk] = $mt[$kk+M] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1]; } for (; $kk $y = ($mt[$kk]&UPPER_MASK)|($mt[$kk+1]&LOWER_MASK); $mt[$kk] = $mt[$kk+(M-N)] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1]; } $y = ($mt[N-1]&UPPER_MASK)|($mt[0]&LOWER_MASK); $mt[N-1] = $mt[M-1] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1]; $mti = 0; return; }
function genrand() { GLOBAL $mt, $mti; if ($mti > N) exit(); if ($mti == N) mt_regen(); $y = $mt[$mti++]; $y ^= ($y >> 11) & 2097151; $y ^= ($y << 7) & -1658038656; $y ^= ($y << 15) & -272236544; $y ^= ($y >> 18) & 16383; return $y; }
собственно сдача карт - ничего хитрого, обычное выдергивание карт из колоды. еще раз повторю, все проблемы - в датчике, а не в процедуре deal
function my_mt_rand($min = 0, $max = 51) { return $min + abs(genrand() % ($max-$min+1)); } -- если быть очень строгим, то в этой процедуре возникает небольшая неравномерность, за счет того что 2**31 (не 32 потому что отбрасывается знак) не делится нацело на 52 ( и 32 тоже), но это несущественно.
function deal($cards) { unset($card); for ($i = 0; $i < $cards; $i++) $card[$i] = $i; for ($i = $cards; --$i;) { $pos = my_mt_rand(0, $i); $t = $card[$pos]; $card[$pos] = $card[$i]; $card[$i] = $t; } return $card; }
yurets (---.krasu.ru) Дата: 24 Мая 2001 16:17
в первой процедуре обрезались строки for... - там в условии стояло "меньше", как тэк пошло :)
function mt_regen() { GLOBAL $mt, $mti, $mag01; for ($kk=0; $kk < N-M; $kk++) { $y = ($mt[$kk]&UPPER_MASK)|($mt[$kk+1]&LOWER_MASK); $mt[$kk] = $mt[$kk+M] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1]; } for (; $kk < N-1; $kk++) { $y = ($mt[$kk]&UPPER_MASK)|($mt[$kk+1]&LOWER_MASK); $mt[$kk] = $mt[$kk+(M-N)] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1]; } $y = ($mt[N-1]&UPPER_MASK)|($mt[0]&LOWER_MASK); $mt[N-1] = $mt[M-1] ^ (($y >> 1)&LOWER_MASK) ^ $mag01[$y & 1]; $mti = 0; return; } ===================== Ребяты! Переведите ето, плз, на русский язык! Хоть узнаем что-нибудь про "честность" етого генератора"
|