一些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 _。
有什么建议吗?
答案 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;请注意,如果所有条件分布均匀,除了导致相同符号出现三次的那些(在减少的结果集上也是均匀的)之外,这将产生与上述约束生成过程相同的分布。