在3K数字的范围内选择一个不同的数字

时间:2014-11-26 19:06:20

标签: javascript arrays database random

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

此时没有什么困难,我的问题是从数据库中挑选总是不同的练习。

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

  
      
  1. 获取练习总数(约3K),
  2.   
  3. 生成1到3000的N个随机数,
  4.   
  5. 从DB中选择N练习,
  6.   
  7. 将N号保存在'used'db表
  8. 中   
  9. 生成另一个号码
  10.   
  11. 这次首先检查生成的号码是否已被使用,
  12.   
  13. 如果没有选择练习,如果是,则生成另一个号码,
  14.   
  15. 等...
  16.   

该代码适用于前2000-2500个数字,然后开始非常慢,因为生成一个尚未使用的随机数开始非常困难。当使用的数字仅略低于3K时,代码完全被破坏:继续检查但新的数字永远不会出现

如何以尽快使用内存的快速轻便方式处理这种情况?

非常感谢!

修改

我在手机应用程序中使用WebSQL

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

这里我得到了练习的次数

1. SELECT COUNT(*) AS countArt FROM Exercises'

这里我从1到totalNumberOfExercises

中选择一个随机数
2. randomNumber = random(totalNumberOfExercises);
   function numeroCasuale(len){
        var num = Math.floor(Math.random() * len) + 0;
        return num;
    };

在这里,我检查我的randomNumber是否已经在数据库中,这意味着已经使用了

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

如果randomNumber存在,我生成另一个randomNumber并一次又一次地检查......

1 个答案:

答案 0 :(得分:2)

使用另一个stackoverflow question

的随机播放功能
function shuffle(o){
    for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
}

你可以创建:

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();

这会创建一个数组,其中位置0 = 0,1 = 1,依此类推并将其随机播放,因此我们有一个没有重复的随机序列。跟踪您已完成的游戏数量,并将此数字用作下一个问题的索引。 Here's a fiddle