【问题标题】:PHP - Generating random integers within specified range from a keyPHP - 从键生成指定范围内的随机整数
【发布时间】:2015-10-24 00:57:06
【问题描述】:

我在 MySQL 数据库中有一组具有唯一 ID 的问题。 用户也有一个唯一的 ID,并且要回答这些问题,他们的答案会保存在数据库中。

现在,我希望用户根据用户 ID 从可用问题池(比如说 50 个)中获得 5 个不重复且唯一且随机选择的问题。因此,当一个 id 为 10 的用户开始回答他的问题,但停下来想稍后返回到同一页面时,他将得到与以前相同的问题。 id 为 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 函数、伪代码或代码 sn-p 的方向上进行推送或提示,这将允许我自己完成。 提前谢谢!

【问题讨论】:

  • 你尝试过php中的rand()函数吗?看这里:w3schools.com/php/func_math_rand.asp
  • 是的,我做了,但是我检查的 PHP 中的 rand 函数不接受任何“键”来生成它们的值,并且每次执行它们时都会生成一组不同的值。
  • 你说的“键”是什么意思?
  • 他想要一个可预测且矛盾的随机数。
  • @Rolle 在您的情况下,我将使用数据库为每个用户保存单个会话和该会话的 questionos id。在这种情况下,您只需生成一次随机密钥,无需考虑以后使用。

标签: php algorithm random


【解决方案1】:

为什么要重新发明轮子

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

【讨论】:

  • 谢谢,这是完美的。我之前可能没有找到这个 PHP 函数,因为我用了一个词“key”而不是“seed”。
【解决方案2】:

在开始时生成随机数并将其保存在会话中。这样,该用户的随机数始终是已知的,您可以通过在会话中查找来知道应该返回哪个问题 ID。

干杯

【讨论】:

    【解决方案3】:

    您可以获得随机的 $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)];
    }
    

    【讨论】:

      【解决方案4】:

      正如this article 建议的那样,您可以使用非重复伪随机数生成器。唯一的问题是生成一个 primnumber,它至少是 ID 上限的 2 倍,并且满足环 Z4 中的条件p = 3。虽然网上应该有足够大的符合条件的primnumber可以免费使用。

      由于我缺乏 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 生成一个唯一的随机数(可以通过与生成一组随机数相同的方式来实现)。

      【讨论】:

      • 他保罗,我明白了,删除了我的答案。基本上,我对 md5() 的建议是 mt_srand() 所做的复杂且可能不可靠的版本。
      【解决方案5】:

      当 ID 为 10 的用户第一次打开页面时,使用 rand() 生成随机数,然后将它们存储到数据库用户表中的一个单元格中。所以 id 为 10 的用户存储了 rand() 数字。

      例如,users 表有 id,rand_questions。 检查 rand_questions 是否为空,然后使用生成的新随机数进行更新,否则从数据库中获取数字。

      【讨论】:

        猜你喜欢
        • 2015-07-21
        • 2018-12-17
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 2016-05-04
        相关资源
        最近更新 更多