Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Код управляемого псевдо-рандома от новичка (изобрел велосипед?)

Anna | 31.05.2014 | нет комментариев

В последнем своем плане мне было нужно написать примитивный и стремительный, но управляемый генератор случайных чисел. Писал сразу позже прохождения codecademy и примерно уверен, что он косой. Заменить кучу if на case не получилось. Его вообще дозволено заменить чем-то больше адекватным?

Выходит. Есть range от $min до $max. Нужно сделать генератор, выдающий числа в определенных границах в соответствии с настройками пользователя. Если $min == 1, a $max == 80, функция должна иметь вероятность генерировать, N чисел от 1 до 10, M от 10 до 20 и так дальше.

<?php
$counts = array (		
                                //например, до 10 - 65 раз из 100										
				'10' => array ('count' => 0, 'ratio' => 0.65),
                                //до 20 - 5 из 100
				'20' => array ('count' => 0, 'ratio' => 0.05),
				'30' => array ('count' => 0, 'ratio' => 0.05),
	                        //count - счетчик срабатываний
				'40' => array ('count' => 0, 'ratio' => 0.05),
				'50' => array ('count' => 0, 'ratio' => 0.05),
				'60' => array ('count' => 0, 'ratio' => 0.05),
				'70' => array ('count' => 0, 'ratio' => 0.05),
				'80' => array ('count' => 0, 'ratio' => 0.05),
                                //total - всеобщий счетчик
				'total' => 1									
				);

//функция проверки на превышение частоты возникновения
function check($count_to_check) {		
	global $counts;
	if ($counts[$count_to_check]['count']/$counts['total'] < $counts[$count_to_check]['ratio']) return True;
	else return False;
}

//функция корректировки счетчиков
function plus($count_to_plus) {			
	global $counts;
	$counts[$count_to_plus]['count']  ;
	$counts['total']  ;
}

//сам генератор
function gen_price($min,$max) {
	global $counts;
	$gen_p = rand($min,$max);									

        if ($gen_p<10) {
			if (check('10')) {									
				plus('10');
				return $gen_p;
			}}
		else if ($gen_p<20) {
			if (check('20')) {
				plus('20');
				return $gen_p;
			}}		
		else if ($gen_p<30) {
			if (check('30')) {
				plus('30');
				return $gen_p;
			}}
		else if ($gen_p<40) {
			if (check('40')) {
				plus('40');
				return $gen_p;
			}}
		else if ($gen_p<50) {
			if (check('50')) {
				plus('50');
				return $gen_p;
			}}
		else if ($gen_p<60) {
			if (check('60')) {
				plus('60');
				return $gen_p;
			}}
		else if ($gen_p<70) {
			if (check('70')) {
				plus('70');
				return $gen_p;
			}}
		else if ($gen_p<=80) {
				if (check('80')) {
					plus('80');
					return $gen_p;
				}}
	}

//проверяем
$min = 1; $max = 80;
for ($tries = 0; $tries < 100; $tries  ) { 
	$price_gen = 0;
        //без while изредка пропуски были
	while (!$price_gen) $price_gen = gen_price($min,$max);
	echo $price_gen . " ";										
}
?>

Если вероятности в сумме составляют 1, то генератор работает весьма предсказуемо и выдает числа, как только это дозволено сделать. Для меньшей предсказуемости дозволено назначить вероятности так, Дабы в сумме было огромнее еденицы, правила все-равно будут соблюдены.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB