如何制定受控的"洗牌"订单?

jfo*_*ain 5 javascript php mysql algorithm shuffle

我在sql数据库中有一套测验游戏问题(实际上是javascript和sqlite).这些问题都有难度级别从1到5,5最难.这是数据的简化可视化......


+---------+--------------+  
|   id    | difficulty   |   
+---------+--------------+  
| 1       |      1       |    
| 2       |      5       |    
| 3       |      2       |    
| 4       |      3       |    
| 5       |      2       | 
| 6       |      2       |    
| 7       |      4       |    
| 8       |      1       |    
| 9       |      5       |    
| 10      |      3       |      
+---------+--------------+   

现在我可以在sql或代码中随机播放这些内容,因此它们是以无序重复的随机顺序,但我也想控制难度字段的排序方式.

因此,例如,我可以有一个改组的问题,其中难度级别顺序看起来像这样......

1,1,5,2,3,3,2,2,2,4

这有几个"困难",这不是我想要的.玩游戏的用户将得到几组同样困难的问题.像这样的订单会更好......

1,2,3,2,5,4,1,2,3,2

我想确保问题被洗牌,但没有困难聚集.如果有任何"团块",那么很少有困难.对MySQL/javascript(或PHP)的任何帮助都会很棒.

qw3*_*w3n 5

而不是将所有ID组合在一起,为什么不按难度对它们进行分组,使每个部分随机化,然后逐个将它们拉出来.或者,一旦它们被随机分类,您可以从随机难度中拉出它们,然后移除该难度级别,直到您有一个问题.

这是我在回答sje397时所考虑的问题,因此我将其添加到我的答案中.

只要所有其他选择加起来最大的组减1,你将没有结块(假设你的算法是正确的).然而,该算法基本上采取从A(具有最多选择数的组)中挑选的形式,从另一组中挑选,从A等中挑选,直到A等于其他组的大小.所以最好的算法会检查找到最大的组并从中挑选.然后它会从另一个组中挑选,然后检查哪个组是最大的,然后从中选择,除非它是之前选择的组等.