rand c приоритетом

Klaus

SEO Cthulhu
rand c приоритетом

Привет all

нужен рандом с приоритетом:
например имеем 10 чисел от 1 до 10
при выборке рандомом нужно приоритет отдать большим числам, т.е. чем больше число тем больше приоритет, но при этом чтобы меньшие числа были обязательно задействованы хотя бы один раз. Выборка происходит не менее 3х раз умноженное на кол-во чисел, т.е. в моем случае выборка идет не менее 30 раз.

Покопался в инете - кое-что набросал:
PHP:
$max = 10; #кол-во цифр
$cycle = 3; #кол-во циклов
$rec = $cycle*$max; #кол-во выборок

for ($i=1;$i<=$max;$i++) {
    $figure[$i] = 0;
}

#функция с приоритетом для чисел имеющих меньшее значение
function low_rnd($max) { 
    
    $candidate = mt_rand(1,$max); 
    if ( mt_rand(1, 2) == 1 ){ 
       return $candidate; 
    }
	elseif ( $candidate > 1 ) {
       return low_rnd( $max / 2 ); 
    }
	else {
       return 1;
	} 
 } 

#функция с приоритетом для чисел имеющих большее значение 
function high_rnd($max) { 
    return $max - low_rnd($max) + 1; 
}

#смотрим процентное соотношение выпадения чисел
for ($i=0; $i<$rec;$i++) {
  $figure[high_rnd($max)]++;
}
echo "<pre>";
print_r($figure);
echo "</pre>";
все вроде хорошо и рандом прекрасно работает
однако имею проблему выпадения некоторых чисел из конечной выборки.

натолкните на мысль, пожалуйста, что тут можно предпринять?
 

Bermuda

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

Создаем массив в котором например 100 элементов. Каждый имеет значение от 1 до 10. Но "10", допустим, будет 20 штук, "9" - будет 18 штук, "8" - 14 и т. д. Далее случайным образом выбираем элемент массива. Большие числа будут выпадать чаще чем маленькие, так как их больше. Мало того, таким образом можно выстроить любую зависимость.
 

Klaus

SEO Cthulhu
Bermuda
да, согласен, перемудрил как обычно :)
но все же - в твоем примере как исключить выпадение чисел из выборки?
 

iliah

Новичок
в дополнение к варианту Bermuda,
если делать такой массив, тогда можно его "перемешать" с помощью shuffle, а потом array_pop (или array_shift) если выбирать польностью - будут все числа
 

IntenT

SkyDiver
Klaus
То что тебе надо - называется случайные числа с неравномерным законом распределения.
Если ты знаешь какой закон плотности распределения вероятности случайной величины - то на основе генератора равномерно-распределенных случайных чисел можно аналитически получить формулу для получения случайных чисел по нужному тебе закону.

Для этого надо взять неопределенный интеграл от интересующей функции плотности вероятности. Если рассматривать значения, принимаемые интегральной функцией, то очевидно, что они распределены на отрезке (0;1)
Причем распределены равномерно.
Если взять функцию обратную от интегральной, то получим функцию, для которой аргумент принимает значения от 0 до 1, а значения, которые эта функция будет возвращать будут иметь заданную плотность распределения вероятности.
 

b0ld

Guest
Originally posted by IntenT
Klaus
То что тебе надо - называется случайные числа с неравномерным законом распределения.
Если ты знаешь какой закон плотности распределения вероятности случайной величины - то на основе генератора равномерно-распределенных случайных чисел можно аналитически получить формулу для получения случайных чисел по нужному тебе закону.

Для этого надо взять неопределенный интеграл от интересующей функции плотности вероятности. Если рассматривать значения, принимаемые интегральной функцией, то очевидно, что они распределены на отрезке (0;1)
Причем распределены равномерно.
Если взять функцию обратную от интегральной, то получим функцию, для которой аргумент принимает значения от 0 до 1, а значения, которые эта функция будет возвращать будут иметь заданную плотность распределения вероятности.
это не математика, а физика. 10 кл, первое полугодие, вторая четверть. Теория Максвелла распределения вероятности скорости частиц.
Средняя скорость v = sqrt (2E/m0); а вероятная скорость v = sqrt (E/m0);

Кому надо, могу зависимоть dN/Ndv (v) написать :)

Вот так-то... я ботан :)
 

Bermuda

Новичок
Лично у нас на физическом факультете теория вероятностей преподавалась как отдельный курс.
 

Klaus

SEO Cthulhu
парни, все это отлично, но не могли бы хоть примерно набросать алгоритм?

Немного неточно я поставил задачу, подправлю.
Вот минимум от которого я бы мог сам попробовать плясать:
есть, допустим, 100 чисел - от 1 до 100
надо сделать 100 выборок по 3 разных числа так, чтобы большие числа имели больший приоритет, т.е. попадали в выборку чаще, но в итоге все(!) числа(хотя бы один раз) попали в кучу этих трехсот чисел.

Если конкретно описать задачу, то это выглядит так:
Есть N наборов элементов, в каждом наборе - X элементов, у каждого элемента есть некий приоритет P(n).
Каждый элемент из одного набора должен найти трех(или более, но не менее - см. сноску) разных друзей из другого набора с учетом приоритета последних. Где в итоге в друзья попадет обязательно каждый элемент, как минимум один раз.

** сноска: Зависит от задачи, но формула должна быть универсальной для трех и более друзей.

сорри, что так запутанно.
 
Сверху