PHP - 从键

时间:2015-08-01 11:53:20

标签: php algorithm random

我在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函数,伪代码或代码片段的方向上推送或提示,这将允许我自己完成。 提前谢谢!

5 个答案:

答案 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