【发布时间】:2014-11-26 19:06:19
【问题描述】:
我正在用 Javascript 构建一个混合应用程序,它随便从数据库中选择一个练习,等待用户解决它,然后再选择另一个练习。
在这一点上没什么难的,我的问题是总是从数据库中选择不同的练习。
现在我的代码以这种方式“工作”:
- 获取练习总数(约 3K),
- 生成一个从1到3000的N个随机数,
- 从 DB 中选择 N 练习,
- 将 N 号保存在 'used' db 表中,
- 生成另一个号码名称,
- 这次首先检查生成的号码是否已经被使用过,
- 如果 NO 选择练习,如果 YES 生成另一个号码,
- 等等……
代码对前 2000-2500 个数字运行良好,然后开始变得非常慢,因为生成一个尚未使用的随机数开始变得非常困难。当使用的数字略小于 3K 时,代码完全损坏:继续检查,但新数字永远不会出现
我怎样才能以尽可能少的内存使用的快速和轻松的方式处理这种情况?
非常感谢!
编辑
我在 phonegap 应用程序中使用 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 并一次又一次地检查它......
【问题讨论】:
-
最好从所有可能的 3000 个数字中生成一个数组,然后删除已经使用的数字,然后从剩余未使用的数字中获取一个随机数
-
将 1 到 3000 的数字放入一个数组中,然后打乱数组。然后,您可以通过增加数组的索引来选择数字,并且保证不会重复。
-
如何生成这个随机数(SQL 或应用程序)?你用的是什么数据库?可以发一些代码吗?
-
@Pointy 你如何洗牌?
-
生成一个介于 1 到 3000 之间的随机数。如果该数字已生成
not been previously,则标记该数字已使用。如果数字是used previously,请使用next数字,即(随机数 + 1)。如果它是索引中的最后一个数字,则转到第一个数字。通过这种方式,您将始终获得unused号码。为了加速这个过程,您可以预先计算随机数并存储在表中,然后简单地一个接一个地获取表中的下一个索引。
标签: javascript arrays database random