2011-01-19 10 views
2

文字列の中にいくつかの文字が出現する頻度を記録しましたが、今では(ほぼ)同じ文字の文字列を持つランダムな文字列を作りたいと思います。私はこれを行うには、次のPerlコードを使用しています。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であると安全に仮定できます。

答えて

0

あなたが示唆したモジュールは、基本的に、あなたの$のテストとして、各選択肢のエンド重みの配列(同じ番号になりますが、ループを使用してありますどのように多くの文字がわからない場合:)

を扱いますあなたが与えられた選択のために$rand < $testに達すると)、それを通してそれを反復します。

1

あなただけの小数点以下の合理的な数の精度を懸念している場合は、1つのアプローチが正しい相対的な周波数のすべての文字を含む文字列を構築するために、次のようになります。

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を大きい数字に置き換えてください。

関連する問題