我在Javascript中构建一个混合应用程序,随便从数据库中选择一个练习,等待用户解决它,然后选择另一个练习。
此时没有什么困难,我的问题是从数据库中挑选总是不同的练习。
现在我的代码“以这种方式运作”:
- 获取练习总数(约3K),
- 生成1到3000的N个随机数,
- 从DB中选择N练习,
- 将N号保存在'used'db表
中- 生成另一个号码
- 这次首先检查生成的号码是否已被使用,
- 如果没有选择练习,如果是,则生成另一个号码,
- 等...
醇>
该代码适用于前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并一次又一次地检查......
答案 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