javascript - 与express js一起使用的synchronize.js

标签 javascript arrays random synchronization

我想生成一个 0-3(包括在内)之间的随机数,并且该数字不应在例如之前生成。生成的数字是1,保存在数组中,然后是3,保存在数组中,然后又是3,哦哦它存在于数组中,所以再次生成0,保存在数组中,然后是2,最后全部保存在数组中按1、3、0、2的顺序。但有时运气并不站在我这边,该函数在与数组中存在的数字进行比较之前返回随机数。这是我到目前为止尝试过的代码:-

  //using synchronized.js
    function f1(choices){
  sync.fiber(function(){
    var options = {     //rand for a choice
      min: 0,
      max:  3,    //choice can be from 0-3 index
      integer: true
    };
    var randomnumber=rn(options);     //random number for choice placement here
    for(var i=0;i<choices.length;i++){
      if(randomnumber==choices[i]){   //if exists, generate the number again
        console.log("rnd generated is: ",randomnumber);
        randomnumber=rn(options);
        i=0;
      }
    }
    console.log("rnd got is: ", randomnumber);
    choices[choices.length]=randomnumber;
    return randomnumber;
  }, function(err,result){
    console.log("sync index is: ",result);
  });
}

但是上述解决方案不起作用,即我得到了重复的索引。我也尝试过使用 deasync 的解决方案:-

function randomChoiceNumber(choices){
  var flag=true;
  var count=0;
  return new Promise(function(resolve,reject){
  var options = {     //rand for a choice
    min: 0,
    max:  3,    //choice can be from 0-3 index
    integer: true
  };
  var randomnumber=rn(options);     //random number for choice placement here
  for(var i=0;i<choices.length;i++){
    if(randomnumber==choices[i]){   //if exists, generate the number again
      flag=false;
      randomnumber=rn(options);
      i=0;
      count=0;
    }else{
      count++;
    } 
  }
  while(count != choices.length && choices.length>0) {
    deasync.sleep(100);
  }
  choices[choices.length]=randomnumber;
  resolve(randomnumber);
  });
}

两者都不起作用,deasync 会进入休眠状态,哈哈,仅生成 1 到 2 个索引。请帮助我实现我想要的,我在这件事上坚持了几个小时。谢谢。

最佳答案

function getRand(){
  var array=[0,1,2,3]
  var newArray=[];
  var times=array.length;
  for(var i=0;i<times;i++){
    var ran=~~(array.length*Math.random());
    newArray[i]=array.splice(ran,1)[0]
  }
  return newArray
}
console.log(getRand())

有很多方法可以生成数组的非重复数字。这不是最好的方法,但由于您使用的是 for 循环和 var,所以这是可行的。

代码基本上从数组中删除一个随机元素,将删除的元素分配到另一个新数组中,直到原始数组为空。

此外,您不应该将其他标签同步放在这里,因为您关注的是远程随机生成。

关于javascript - 与express js一起使用的synchronize.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48002937/

相关文章:

javascript - 谷歌浏览器 - JS 和 CSS 问题

javascript - 我可以通过 nightwatch.js 中的数组位置选择一个元素吗?

c# - 更好的 C# 随机函数

java - 在 ImageView 之上显示动画

javascript - 在加载了 ngmap 的 map 上显示信息窗口

javascript - 是否可以从不同页面添加到 bootstrap 4 nav-pills 选项卡面板的链接?

javascript - 如果满足某些条件,则循环对象并为对象数组赋值 - vanilla JavaScript

c# - 使用列表的 ASP.Net 随机生成器

javascript - window.setTimeout执行哪个好

java - 我正在研究数组的基本排序算法,尽管解决方案有效,但我不太完全理解