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

Pick always a different number in a range of 3K numbers

本文关键字:数字 选择 范围内 3K      更新时间:2023-09-26

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

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

现在我的代码以这种方式"工作":

  1. 获取练习总数(约 3K),
  2. 生成一个从 1 到 3000 的 N 个随机数,
  3. 从数据库中选择 N 个练习,
  4. 将 N 个数字保存在"已使用的"db 表中,
  5. 生成另一个数字名称,
  6. 这次首先检查生成的数字是否已经被使用,
  7. 如果没有选择练习,如果 YES 生成另一个数字,
  8. 等。。。

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

如何以快速而轻便的方式处理这种情况,尽可能少地使用内存?

谢谢!

编辑

我在电话间隙应用程序中使用 WebSQL

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

在这里我得到了练习的数量

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

在这里,我从 1 到总练习数中选择一个随机数

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 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 等的数组,并对其进行洗牌,以便我们得到一个没有双倍的随机序列。跟踪您已完成的游戏数量,并使用此数字作为下一个问题的索引。这是一个小提琴。