Генерация случайных результатов в развес в PHP?

Вы можете использовать String.Replace (), чтобы заменить нужную строку разделения символом, который не встречается в строке, а затем использовать String.Split для этого символа, чтобы разделить результирующую строку на тот же эффект.

54
задан kyct 15 January 2009 в 00:44
поделиться

4 ответа

Для эффективного случайного числа, скашиваемого последовательно к одному концу масштаба:

  • Выбирают непрерывное случайное число между 0.. 1
  • Возводят в степень Оі, для смещения его. 1 не взвешено, ниже дает больше более высоких чисел и наоборот
  • Масштаб к желаемому диапазону и вокруг к целому числу

, например, в (непротестированном) PHP:

function weightedrand($min, $max, $gamma) {
    $offset= $max-$min+1;
    return floor($min+pow(lcg_value(), $gamma)*$offset);
}
echo(weightedrand(1, 10, 1.5));
29
ответ дан bobince 7 November 2019 в 17:38
поделиться

Существует довольно хорошее учебное руководство для Вас .

В основном:

  1. Сумма веса всех чисел.
  2. Выбор случайное число меньше, чем тот
  3. вычитают веса в порядке, пока результат не отрицателен, и возвратите то число, если это.
23
ответ дан Allain Lalonde 7 November 2019 в 17:38
поделиться

Наивный взлом для этого должен был бы создать список или массив как

1, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10

И затем выбрать случайным образом из этого.

11
ответ дан Iain Holder 7 November 2019 в 17:38
поделиться

Это руководство проведет вас через это, в PHP с несколькими решениями для вырезания и вставки. Обратите внимание, что эта процедура немного изменена по сравнению с тем, что вы найдете на этой странице, в результате комментария ниже.

Функция взята из поста:

/**
 * weighted_random_simple()
 * Pick a random item based on weights.
 *
 * @param array $values Array of elements to choose from 
 * @param array $weights An array of weights. Weight must be a positive number.
 * @return mixed Selected element.
 */

function weighted_random_simple($values, $weights){ 
    $count = count($values); 
    $i = 0; 
    $n = 0; 
    $num = mt_rand(1, array_sum($weights)); 
    while($i < $count){
        $n += $weights[$i]; 
        if($n >= $num){
            break; 
        }
        $i++; 
    } 
    return $values[$i]; 
}
6
ответ дан 26 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: