Javascript 向GeneratorDomainNumber函数添加规则

Javascript 向GeneratorDomainNumber函数添加规则,javascript,Javascript,我试图创建一个函数,从给定的间隔生成一个随机数,但我希望能够只生成3个相同的连续数。例如,如果a具有间隔[0,4)我想要: 接受:1,2,2,2,1,0 不接受:1、2、2、2、3、0 我发现多线程函数生成的数字与前一个不同,但我不知道如何更改它以完成我需要的。有什么想法吗?试试这个 函数随机性(最小值、最大值、极限值=3){ 如果(最小值>最大值){ [max,min]=[min,max]; } 函数getBetween(最小值、最大值){ 返回Math.floor(Math.random

我试图创建一个函数,从给定的间隔生成一个随机数,但我希望能够只生成3个相同的连续数。例如,如果a具有间隔
[0,4)
我想要:

  • 接受:1,2,2,2,1,0
  • 不接受:1、2、2、2、3、0
我发现多线程函数生成的数字与前一个不同,但我不知道如何更改它以完成我需要的。有什么想法吗?

试试这个

函数随机性(最小值、最大值、极限值=3){
如果(最小值>最大值){
[max,min]=[min,max];
}
函数getBetween(最小值、最大值){
返回Math.floor(Math.random()*(max-min))+min;
}
让我们坚持下去;
让计数=0;
返回函数generate(){
const result=getBetween(最小值、最大值);
计数=(结果==上次)?计数+1:0;
如果(计数>限制){
返回generate();
}
最后=结果;
返回结果;
};
}

当您生成一个不同的数字时,您必须完全重置计数器。而不仅仅是减少它

函数设置随机间隔(最小、最大、允许重复){
var last,//保留最后一个随机值
repeatCount=0,//重复值的计数
getR=function(){return Math.floor(Math.random()*(max-min))+min;};
如果(最小值>=最大值){
抛出“选定间隔['+min+','+max+')不适用于随机数。“;
}
返回函数(){
var r=getR();
如果(r!=last){
repeatCount=0;//尚未重复
}否则,如果(repeatCount
这里有一个片段,它可以防止同一个数字的随机化次数超过3次。如果该数字的
计数
大于
限制
,则会再次调用
随机数
(依此类推,直到它不会得到相同的值为止)

您可以看到(运行时)最大的序列是3。
const limit=3;
设last=null,
计数=0;
函数getRndInteger(最小值、最大值){
返回Math.floor(Math.random()*(max-min))+min;
}
函数随机数(最小值、最大值){
设num=getRndInteger(最小值,最大值);
如果(最后!==num){
last=num;
计数=0;
}
计数++;
如果(计数>限制){
num=随机数(最小值、最大值);
}
返回num;
}
for(设i=0;i<20;i++)

log(randomNumber(0,2));
这里有一种方法,它使用了现代JS.Generators的一个很好的特性

使用生成器,您可以创建可组合的代码。您可以组合一个函数而不是将多个生成器流式连接在一起,这对于生成可重用的代码非常有用

下面我创建了3个函数

  • randomValues=>这只会在一个范围内生成随机数
  • repeatLimit=>此生成器仅阻止x个重复值
  • iterCount=>此生成器在计数迭代后停止
您所做的就是将所有这些生成器组合在一起,但好处是这些生成器可以在其他地方使用。例如,
[…repeatLimit(3[1,1,1,1,0,0,0])
将返回
1,1,1,0,0,0

函数*随机值(最小值、最大值){
常数范围=最大值-最小值;
while(true)
屈服最小值+数学真值(数学随机()*范围);
}
功能*重复限制(限制,发电机){
设rcount=0,右值;
for(让g代表gen){
如果(r值===g)rcount+=1;否则rcount=1;
r值=g;

如果(r根据您的使用情况,在函数中编写太多规则是一个坏主意-您越是限制随机性,出现的模式就越多。您能更具体一点吗?我无法用给定的信息和示例理解您的规则。请给出一个更详细的示例,并解释一下您编写的代码是如何使用的。)rYou可以存储函数外生成的最后三个数字,并检查新生成的数字是否与存储的数字不一样。您的问题和使用的语言不太清楚。但是,请参阅此处以获取随机数字生成,并在新范围内使用n-1、n-2索引来检测是否有任何违反3个连续ru的情况莱斯。谢谢你给我分享执行的细节!我从中吸取了教训,我也感谢你为此付出的大量时间和精力帮助我。代码有效,我现在明白我做错了什么。感谢你让这段代码如此干净和可重用。它工作得非常完美,我从中学到的东西比我想象的要多,我想谢谢你!