0

何人かの人々は私がランダマイザーを作るのを手伝ってくれました:

function makeid() {
    var text = "";
    var possibleChars = "._";
    var possibleLetters = "AB";

    text += possibleLetters.charAt(Math.floor(Math.random() * possibleLetters.length));
    for( var i=0; i < Math.floor(Math.random() * 3)+1; i++ )
        text += " " + possibleChars.charAt(Math.floor(Math.random() * possibleChars.length));

    return text;
}

for (var i=0; i < 20; i++)
    $("body").append("<div>" + makeid() + "</div>");

次のような出力があります。

B。。

B。

B _ _

A_。

B。

A。

A _

B。。

A _

A _

B_。

B。。。

B _

B_。

上記のJavaScriptコードを変更して、AとBが連続して2回以上繰り返されないようにします。

A。。

B。

B _ _

A_。

B。

A。

A _

B。。

A _

A _

B_。

B。。。

A _

B_。

助言がありますか?

4

3 に答える 3

1

最後に生成された2つの文字を覚えておいてください(または、さらに良いことに、最近生成された同じ文字の連続した量-他の数字に適応する方が簡単です)。新しいものがほぼ同じである場合は、別のものを挿入します。終わり。

狂気は苦しむでしょう。

于 2012-06-29T10:42:29.717 に答える
1

ここに行きます-きれいではありませんが、動作するはずです(alas、テストされていません):

function makeid() {
    var text = "";
    var possibleChars = "._";
    var possibleLetters = "AB";

    while ( true ) {
        var ch= possibleLetters.charAt(Math.floor(Math.random() * possibleLetters.length));
        if ( this._prev1 != this._prev2 || this._prev1 != ch ) break;
    }
    this._prev2= this._prev1;
    this._prev1= ch;
    text += ch;

    for( var i=0; i < Math.floor(Math.random() * 3)+1; i++ )
        text += " " + possibleChars.charAt(Math.floor(Math.random() * possibleChars.length));

    return text;
}
于 2012-06-29T10:43:36.173 に答える
0

もちろん、分布からランダムなサンプルを生成する方法は、分布によって異なります。それを気にしない場合は、生成された最後の2文字を追跡し、制約を満たさない場合は新しく生成された文字を破棄することができます。

ただし、これを2次マルコフモデルとして扱いたい場合は、P(A | AA)= 0のように、先行する2つの文字を指定してすべての文字の確率を定義することをお勧めします。P(B | AA)= 1; P(A | BB)= 1; P(B | BB)= 0; P(A | AB)= 0.5; P(B | AB)= 0.5; など。すべての条件付き分布が均一である場合、同じシンボルが3回表示されるもの(結果の削減されたセット全体でも均一)を除いて、これにより、上記の制約付き生成手順と同じ分布が生成されることに注意してください。

于 2012-06-29T10:40:38.797 に答える