2015-06-12 57 views
0

背景:如果您种植您的prng,它将打印出相同的随机序列。所以,如果我告诉你,我使用了种子123,我得到了1,5,2,4。然后,你可以使用种子123并获得1,5,2,4。保持会话持续时间的随机种子

我想做什么在最简单的情况下......我制作一个网页,让您输入种子。然后,它会显示一个随机数和一个“下一个”链接。您点击下一个链接并获取下一个随机数。问题是单击“下一个”时访问的页面与上一页没有任何关系。所以,它不是基于输入的种子。

我想要做什么,而且我显然忽略了一些东西,就是在会议期间保持种子。我可以播种第一个随机数的兰特。然后,我需要将更新的种子存储在会话中,以便下次用户出现时我可以选择适当的下一个种子。是否有与srand相反的?我不想种下兰特。我想获得所需的值,以使其在当前状态下开始下一次加载。

+2

保持种子值和会话计数:对每个请求,播种PRNG,然后生成随机数达数,并且将它们丢弃....产生下一个随机数,并增加计数 –

+0

@MarkBaker - 可能是唯一的方法;否则,PRNGS通常不会公开内部必需的内容。这个,或者写下你自己的,但我不确定是否有任何知名的实现甚至有中间种子的概念... –

+0

嗯...看起来像[线性同余发生器](https:// en.wikipedia.org/wiki/Linear_congruential_generator)做你想做的,但你可能必须自己实现它。 –

回答

0

您可以通过始终使用生成的最后一个随机数重新初始化srand来解决您的问题。你“混合”种子,但你仍然有一种可重复的方式来产生随机数。

下面是一些代码:

function getNextRandomNumber() 
{ 
    $mySeed = 0; // a default seed value 
    if (isset($_SESSION['seed'])) 
    { 
     // continue our seed serie 
     $mySeed = $_SESSION['seed']; 
    } 
    else if (isset($_GET['seed'])) 
    { 
     // reinitialize the seed serie with a user's value 
     $mySeed = $_GET['seed']; 
    } 
    // reproducable srand value 
    srand($mySeed); 

    // generate the random number 
    $rand = rand(); 
    // We save the seed 
    $_SESSION['seed'] = $rand; 

    return $rand; 
} 
+0

这正是我所做的 - 略有不同。我使用mt_rand,并在最小/最大值之间生成随机数。然后,我为下一个种子做了第二个兰德(无界)。我测试了它的迭代次数为1,000,000次,范围为1到20,每个值都显示了5%的时间。 – kainaw