Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 始终在3K数字范围内选择不同的数字_Javascript_Arrays_Database_Random - Fatal编程技术网

Javascript 始终在3K数字范围内选择不同的数字

Javascript 始终在3K数字范围内选择不同的数字,javascript,arrays,database,random,Javascript,Arrays,Database,Random,我正在用Javascript构建一个混合应用程序,它可以随意地从数据库中选择一个练习,等待用户解决,然后选择另一个练习 在这一点上并没有什么困难,我的问题是总是从数据库中选择一个不同的练习 现在,我的代码以这种方式“工作”: 获取练习的总数(约3K) 生成一个从1到3000的N个随机数 从DB中选择N个练习 将N号保存在“已使用”数据库表中 生成另一个数字名称 这一次首先检查生成的号码是否已被使用 如果没有选择练习,如果是,则生成另一个数字 等等 该代码对于前2000-2500个数字运行良好,然

我正在用Javascript构建一个混合应用程序,它可以随意地从数据库中选择一个练习,等待用户解决,然后选择另一个练习

在这一点上并没有什么困难,我的问题是总是从数据库中选择一个不同的练习

现在,我的代码以这种方式“工作”:

  • 获取练习的总数(约3K)
  • 生成一个从1到3000的N个随机数
  • 从DB中选择N个练习
  • 将N号保存在“已使用”数据库表中
  • 生成另一个数字名称
  • 这一次首先检查生成的号码是否已被使用
  • 如果没有选择练习,如果是,则生成另一个数字
  • 等等
  • 该代码对于前2000-2500个数字运行良好,然后开始变得非常缓慢,因为生成一个尚未使用的随机数开始变得非常困难。当使用的号码略小于3K时,代码完全被破坏:继续检查,但新号码从未出现

    我如何快速轻松地处理这种情况,尽可能少地使用内存

    多谢各位

    编辑

    我正在phonegap应用程序中使用WebSQL

    这就是我正在做的(代码):

    这是练习的编号

    1. SELECT COUNT(*) AS countArt FROM Exercises'
    
    这里我从1到TotalNumberOfExactions中选择一个随机数

    2. randomNumber = random(totalNumberOfExercises);
       function numeroCasuale(len){
            var num = Math.floor(Math.random() * len) + 0;
            return num;
        };
    
    在这里,我检查我的随机数是否已经在数据库中,这意味着已经使用了

    4. SELECT EXISTS(SELECT * FROM alreadyUsed WHERE numero=randomNumber)
    

    如果存在随机数,我将生成另一个随机数并反复检查…

    使用另一个随机数的洗牌功能:

    您可以创建以下内容:

    function generateRandomSequence(amount){
        var random = [];
        for (var i = 0; i<amount; i++) random[i] = i;
        return shuffle(random);
    }
    
    var random = generateRandomSequence(3000);
    var gamesCompleted = 0;
    
    function nextGame(){
        console.log(random[gamesCompleted]);
        gamesCompleted++;
    }
    
    nextGame();
    
    函数生成器域序列(金额){
    var random=[];
    
    对于(var i=0;i.

    最好从所有可能的3000个数字中生成一个数组,然后删除已经使用的数字,然后从剩余的未使用数字中获取一个随机数。将1到3000的数字放入一个数组,然后将数组洗牌。然后,您可以通过在数组中增加索引来选择数字,并且您可以保证不会这样做获取一个副本。如何生成此随机数(SQL或应用程序)?您使用的是什么数据库?您可以发布一些代码吗?@Pointy如何洗牌数组?生成一个介于1到3000之间的随机数。如果该数字以前未生成过,请标记该数字已使用过。如果该数字以前使用过,请使用下一个编号,即(随机数+1)。如果它是索引中的最后一个数字,请转到第一个数字。这样,您将始终得到一个未使用的
    数字。为了加快此过程,您可以预先计算随机数并存储在表中,然后只需依次获取表中的下一个索引。我认为您的答案是好的,但我的问题是我需要d永久存储随机数数组,因为代码需要在PaoneGap应用程序中工作,我希望即使用户关闭appAha,所选的练习也是唯一的。在这种情况下,请将其保存在本地存储中。快速示例,当应用程序启动时,检查if
    localStorage.getItem('randomSequence'))==null
    如果为true,则生成序列并将其保存到localStorage,如果为false,则从那里获取项目。您需要使用
    JSON.stringify()
    JSON.parse()
    将其作为字符串存储在localStorage中。别忘了保存并加载游戏完成的数量。这有意义吗?如果你愿意,我可以写一个例子并将其添加到答案中。非常感谢!我了解localStorage,我只是问一个问题:localStorage读/写速度不是很慢吗?如果你有很多数据,并且注意到它是同步的,这意味着你的应用程序在加载数据时会挂起。我认为你应该测试一下它的影响。将一个日期对象保存到一个变量中,并在加载和保存后从另一个日期对象中减去它。总之,你将在每个安装生命周期编写一次序列,并在用户每次打开应用程序时检索它(不是从后台)。我认为这还不错。使用WebSQL(我已经在使用)怎么样?应该更快,还是我错了?
    function generateRandomSequence(amount){
        var random = [];
        for (var i = 0; i<amount; i++) random[i] = i;
        return shuffle(random);
    }
    
    var random = generateRandomSequence(3000);
    var gamesCompleted = 0;
    
    function nextGame(){
        console.log(random[gamesCompleted]);
        gamesCompleted++;
    }
    
    nextGame();