限制连续数量" As"和" Bs"在这个随机数发生器

时间:2012-06-29 10:22:35

标签: javascript random

一些folks帮我构建了一个随机数发生器:

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不会重复连续两次以上:

  

A。

     

B。

     

B _ _

     

A _。

     

B。

     

A。

     

A _

     

B.

     

A _

     

A _

     

B _。

     

B. 。

     

A _

     

B _。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

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

Radomness会受到影响。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

如果你想把它当作二阶Markov模型,那么定义前两个字母的每个字母的概率会更好,比如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;请注意,如果所有条件分布均匀,除了导致相同符号出现三次的那些(在减少的结果集上也是均匀的)之外,这将产生与上述约束生成过程相同的分布。