我在MySQL数据库中有一组带有唯一ID的问题。 用户还有一个唯一的ID,并且要回答这些问题,他们的答案会保存在数据库中。
现在,我希望用户根据用户ID从可用的池中找到5个非重复的唯一且随机挑选的问题(假设为50)。因此,当id为10的用户开始回答他的问题,但停止并想要稍后返回同一页面时,他将得到与以前相同的问题。身份为11的用户将获得一组不同的随机问题,但对于他来说总是相同的,并且与所有其他用户不同。
我发现random.org可以生成我需要的序列生成器,它根据提供的ID生成随机数字序列: https://www.random.org/sequences/?min=1&max=50&col=1&format=plain&rnd=id.10 但我希望这一代能在本地完成而不是依赖random.org API。
因此,我需要在指定范围'Y'内生成'X'唯一随机整数,这些整数是根据提供的整数'Z'生成的。我应该可以调用一个以'Z'作为参数的函数,并且每次都收回相同的'X'整数。
我需要知道如何使用PHP代码复制这一代,或至少在PHP函数,伪代码或代码片段的方向上推送或提示,这将允许我自己完成。 提前谢谢!
答案 0 :(得分:0)
在开头生成随机数并将其保存在会话中。这样,该用户的随机数始终是已知的,您可以通过在会话中查找来了解您应该返回的问题ID。
干杯
答案 1 :(得分:0)
当ID 10的用户第一次打开页面时,使用rand()生成随机数,然后将它们存储到数据库中users表的单元格中。因此,id为10的用户存储了rand()号。
例如,users表具有id,rand_questions。 检查rand_questions是否为空,然后使用生成的新随机数进行更新,否则您将从数据库中获取数字。
答案 2 :(得分:0)
你可以得到随机的$ w数组值。尝试将此代码作为示例,并根据您的逻辑进行更改。
$w = array('0'=>11,'1'=>22,'2'=>44,'3'=>55,'4'=>66,'5'=>88);
$str = '';
for($i=0;$i<5;$i++) {
$str.= $w[rand(0,5)];
}
答案 3 :(得分:0)
如this article所示,您可以使用非重复的伪随机数生成器。唯一的问题是生成一个至少是ID的上限2倍的primnumber并且满足环Z4中的条件p = 3
。虽然应该有足够大的原始数据符合网上的条件以供免费使用。
由于我缺乏PHP经验,我只能提供伪代码。
int[] generateUniqueRands(int id , int ct)
int[] res
const int prim//the primnumber described above
for int i in [0 , ct[
res[i] = ((id + i) * (id + i)) % prim
return res
请注意,此算法基本上像窗口一样工作:
id = x set = [a , b , c , d]
id = x + 1 set = [b , c , d , e]
...
如果你想避免这种行为,只需先从id生成一个唯一的随机数(可以用生成随机数集的相同方式实现)。
答案 4 :(得分:0)
为什么重新发明轮子
mt_srand(44);
for ($i=0; $i < 10; $i++) echo mt_rand(). "\n";
echo "\n\n";
mt_srand(44);
for ($i=0; $i < 10; $i++) echo mt_rand(). "\n";
结果
362278652
928876241
1914830862
68235862
1599103261
790008503
1366233414
1758526812
771614145
1520717825
362278652
928876241
1914830862
68235862
1599103261
790008503
1366233414
1758526812
771614145
1520717825