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>");

它输出如下内容:

乙。.

乙。

乙 _

一个 _ 。

乙。

一个 。

一个 _

乙。.

一个 _

一个 _

乙_。

乙。. .

乙_

乙_。

我想修改上面的 JavaScript 代码,使 A 和 B 不会连续重复两次以上:

一个 。.

乙。

乙 _

一个 _ 。

乙。

一个 。

一个 _

乙。.

一个 _

一个 _

乙_。

乙。. .

一个 _

乙_。

有什么建议么?

4

3 回答 3

1

记住最后生成的两个字母(或者,更好的是:连续最近生成的相同字母的数量 - 适应任何其他数字会更容易)。如果新的将要相同,请插入另一个。完毕。

随机性会受到影响。

于 2012-06-29T10:42:29.717 回答
1

给你 - 不漂亮,但应该工作(唉,未经测试):

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

当然,从分布中生成随机样本的方式取决于分布。如果您不关心这一点,您可以简单地跟踪生成的最后两个字母,如果它们不满足约束,则丢弃新生成的字母。

但是,如果您想将此视为二阶马尔可夫模型,最好定义给定前两个字母的每个字母的概率,例如 P(A|AA)=0; P(B|AA)=1;P(A|BB)=1;P(B|BB)=0;P(A|AB)=0.5;P(B|AB)=0.5;请注意,如果所有条件分布都是均匀的,除了导致相同符号出现三次的那些(在减少的结果集上也是均匀的),这将产生与上述约束生成过程相同的分布。

于 2012-06-29T10:40:38.797 回答