Рисование персонажей с заданными вероятностями в Perl - PullRequest
2 голосов
/ 19 января 2011

Я записал, как часто некоторые буквы встречаются в наборе строк, и теперь я хочу создать несколько случайных строк, которые имеют (приблизительно) одинаковый состав букв.Для этого я использую следующий код Perl.

my $random_string = "";

while(length($random_string) < $length)
{
  my $probabilities =
  {
    A => 0.2790114613,
    B => 0.1880372493,
    C => 0.2285100287,
    D => 0.3044412607,
  };
  my $test = 0;

  $test += $probabilities->{ A };
  if($rand < $test)
  {
    $sequence .= "A";
    next;
  }
  $test += $probabilities->{ B };
  if($rand < $test)
  {
    $sequence .= "B";
    next;
  }
  $test += $probabilities->{ C };
  if($rand < $test)
  {
    $sequence .= "C";
    next;
  }
  $sequence .= "D";
}

Есть ли лучший способ сделать это?Как я могу обрабатывать случаи, когда я не знаю, сколько букв нужно рассмотреть?Можно смело предположить, что сумма вероятностей для всех букв равна 1.

Ответы [ 3 ]

5 голосов
/ 19 января 2011
1 голос
/ 19 января 2011

Если вас беспокоит только точность до разумного числа десятичных знаков, один из подходов состоит в том, чтобы создать строку, содержащую все буквы с правильными относительными частотами:

my $sample = "";

while (my ($letter, $freq) = each %$probabilities) {
    $sample .= $letter x ($freq * 1000);
}

Тогда простопроизвольно выбирайте буквы из этой строки:

while (length($sequence) < $length) {
    $sequence .= substr($sample, rand length $sample, 1);
}

Замените 1000 на большее число для большей точности.

0 голосов
/ 19 января 2011

Вы обрабатываете случаи, когда вы не знаете, сколько букв есть, используя цикл:)

Предлагаемый модуль в основном создает массив конечных весов для каждого выбора (то же число, что и ваш $проверить, когда вы достигнете $rand < $test для данного выбора) и выполните итерацию по нему.

...