我正在为Android编写一个多项选择测验程序,并希望为其添加一个随机化功能,也就是说,问题将来自一个列表,并且每次进行测验时顺序都会不同。我有一个大约600个问题的列表,这些问题按顺序编号并存储在哈希映射中。限制是我不想在给定的测验中两次问同一个问题。
我最初考虑创建一个单独的地图来跟踪问题。然后,为了得到下一个问题,有一个循环得到一个随机数(根据用户指定选择的问题范围),并检查答案地图,看看是否已经询问了这个问题。但是,随着回答的问题数量的增加,这将需要对每个问题进行线性增加的查找量,直到达到100次查找。
如果我将给定测验的问题数量限制为100,那么100次查找可能不会花费很长时间。我可以设置一个小的延迟因子,以保持用户注意。
另一种可能的解决方案是在测验开始时创建一个包含未提出问题的地图。回答问题后,将其从未解决的问题地图中删除。要选择下一个问题,请将未答复的问题映射转换为数组,获取数组大小,并获得介于0和数组大小之间的随机数。使用未答复的问题数组中的该条目。
这第二个解决方案由于其简单性而受到吸引,但是数组提取过程可能会变得很慢,并且可以选择大量问题(最终可能有数千个)。
这样做的好方法是什么?
答案 0 :(得分:6)
这可能会有所帮助:http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
这是一种混合列表中项目的算法。我的问题是:一个测验是否包含所有600个问题,或者是否会向用户询问问题的随机子集,如果是,他们是否有可能在以后再次向600询问不同的问题?您可以随时为每个用户创建并保存特定于用户的随机排序,以便他们以后可以恢复他们的随机测验......
答案 1 :(得分:6)
使用1到600之间的整数创建一个数组,对其进行随机排列并为您的问题选取前N个元素。这会给你一个随机的数字链而不重复。
答案 2 :(得分:2)
我更喜欢生成随机排列(存储在int [n]数组中,从0到n - 1)并从此列表中取出数字。
但实际上问题是你更容易实现。 600件物品没有区别。