Algorithm 关于随机数序列生成

Algorithm 关于随机数序列生成,algorithm,random,Algorithm,Random,我不熟悉随机算法,自己通过读书来学习。我正在读马克·艾伦·韦斯斯的《数据结构和算法分析》一书 假设我们只需要掷硬币;因此,我们必须生成一个0或1 随机。一种方法是检查系统时钟。时钟 可以将时间记录为计算秒数的整数 自1970年1月1日起(至少在Unix系统上)。然后我们可以使用 最低位。问题是如果一个序列 需要一组随机数。一秒钟是很长的时间,时钟 程序运行时可能根本不会更改。即使时间 如果程序由运行,则以微秒为单位记录 就其本身而言,将产生的数字序列将是遥远的 从随机开始,因为调用生成器的间隔

我不熟悉随机算法,自己通过读书来学习。我正在读马克·艾伦·韦斯斯的《数据结构和算法分析》一书

假设我们只需要掷硬币;因此,我们必须生成一个0或1 随机。一种方法是检查系统时钟。时钟 可以将时间记录为计算秒数的整数 自1970年1月1日起(至少在Unix系统上)。然后我们可以使用 最低位。问题是如果一个序列 需要一组随机数。一秒钟是很长的时间,时钟 程序运行时可能根本不会更改。即使时间 如果程序由运行,则以微秒为单位记录 就其本身而言,将产生的数字序列将是遥远的 从随机开始,因为调用生成器的间隔时间 在每次程序调用中基本相同。那么,我们看到 真正需要的是一系列随机数。这些数字 应该显得独立。如果一枚硬币被抛了出来, 下一次投币仍有可能出现正面或负面影响 尾巴

以下是关于上述文本片段的问题

  • 在上面的文本片段“对于计数秒数,我们可以使用最低位”,作者提到这不起作用,因为1秒是很长的时间, 我的问题是,为什么一秒钟是很长的时间,而时钟每秒钟都会变化,以及作者所指的上下文 那个时钟不变?请用简单的例子帮助理解

  • 作者是如何提到即使是微秒,我们也不能得到随机数序列的


  • 谢谢!

    不要忘记,对于一台计算机来说,一秒钟可能是“永恒的”。程序/算法通常在几毫秒内执行(千分之一秒)

    以下伪代码:

    for(int i = 0; i < 1000; i++)
       n = rand(0, 1000) 
    
    srand(time());
    for(int i = 0; i < 1000; i++)
       n = rand(0, 1000) 
    
    for(int i=0;i<1000;i++)
    n=兰特(0,1000)
    
    用0到1000之间的随机数填充n一千次。在典型的机器上,此脚本几乎立即执行

    虽然通常仅在开始时初始化种子:

    以下伪代码:

    for(int i = 0; i < 1000; i++)
       n = rand(0, 1000) 
    
    srand(time());
    for(int i = 0; i < 1000; i++)
       n = rand(0, 1000) 
    
    srand(time());
    对于(int i=0;i<1000;i++)
    n=兰特(0,1000)
    
    初始化种子一次,然后执行代码,生成一组看似随机的数字。然后,当您多次执行代码时,问题就会出现。假设代码在3毫秒内执行。然后代码在3毫秒内再次执行,但两次都在同一秒内执行。结果是相同的数字集


    关于第二点:作者可能假设计算机速度很快。上述问题仍然存在…

    不要忘记,对于计算机来说,一秒钟可能是“永恒的”。程序/算法通常在几毫秒内执行(千分之一秒)

    以下伪代码:

    for(int i = 0; i < 1000; i++)
       n = rand(0, 1000) 
    
    srand(time());
    for(int i = 0; i < 1000; i++)
       n = rand(0, 1000) 
    
    for(int i=0;i<1000;i++)
    n=兰特(0,1000)
    
    用0到1000之间的随机数填充n一千次。在典型的机器上,此脚本几乎立即执行

    虽然通常仅在开始时初始化种子:

    以下伪代码:

    for(int i = 0; i < 1000; i++)
       n = rand(0, 1000) 
    
    srand(time());
    for(int i = 0; i < 1000; i++)
       n = rand(0, 1000) 
    
    srand(time());
    对于(int i=0;i<1000;i++)
    n=兰特(0,1000)
    
    初始化种子一次,然后执行代码,生成一组看似随机的数字。然后,当您多次执行代码时,问题就会出现。假设代码在3毫秒内执行。然后代码在3毫秒内再次执行,但两次都在同一秒内执行。结果是相同的数字集

    关于第二点:作者可能假设计算机速度很快。上述问题仍然适用于…

    使用随机(或在本例中为伪随机)的程序数字通常在短时间内需要大量的数字。这就是为什么简单地使用时钟并不能真正起作用的原因之一,因为系统时钟的更新速度不如代码请求新数字的速度快,因此在时钟改变之前,qui很可能会一次又一次地得到相同的结果。在Unix系统上,这可能更为明显ems中,通常的获取时间的方法只会给你第二次的准确度,甚至微秒也没有真正的帮助,因为到目前为止,计算机的速度要快得多

    第二个要避免的问题是伪随机值的线性依赖性。假设你想在一个正方形中随机放置一些点。你将选择一个x和一个y坐标。如果你的伪随机值是一个简单的线性序列(就像你从时钟中天真地获得的)你会得到一条对角线,许多点聚集在同一个地方。这真的不起作用

    作为最简单的伪随机数生成器之一,虽然乍一看并不是很明显,但它也有类似的问题

    您仍将获得相当可预测的结果,尽管只有在3D空间中拾取点,因为所有数字都位于多个不同的平面上(所有伪随机生成器在特定维度上都会出现此问题):

    使用随机(或在本例中为伪随机)的程序数字通常在短时间内需要大量的数字。这就是为什么简单地使用时钟并不能真正起作用的原因之一,因为系统时钟的更新速度不如代码请求新数字的速度快,因此在时钟改变之前,qui很可能会一次又一次地得到相同的结果。在Unix系统上,这可能更为明显ems中,通常的获取时间的方法只会给你第二次的准确度,甚至微秒也没有真正的帮助,因为到目前为止,计算机的速度要快得多

    要避免的第二个问题是伪随机值的线性依赖性。假设您要在正方形中放置多个点,