我用rand()函数得到一个随机数
 
例如我第一次随机选了一个78406
我退出程序在进入在选还是78406
每次退出在进都是这个数这是为什么呢
不只是第一个数是这样
第二个数
第三个数
......
也是分别相同的 

解决方案 »

  1.   

    rand()返回的是虚假的随机数.默认的种子是1.你可以通过srand()来改变它.但是调用srand()就意味着你已经得到了随机数?下面的代码看上去是得到一个随机数,但是事实并非如此:#include <stdlib.h> /* header for rand() and srand() */ 
    #include <stdio.h> /* io header */ 
    int main() 
    { srand(rand()); for(int i=0;i<=9;i++) 
    printf("%d\n",rand()); return 0; 
    } 每运行一次,其输出都是一个结果,您可以测试一下.也就是说要是程序在每次启动需要不同的随机数,这个方法是不可行的.如何来解决?上面提及的srand()可以改变种子的值.但是如果你将它设为常量,那么随机数列也就是常量.可以用srand(time(0))来解决.time()返回一个time_t.你可以认为它是一个整型(int),并且值是不同的.那么,我们现在可以这么写代码来实现要求:#include <stdlib.h> /* header for rand() and srand() */#include <stdio.h> /* io header */#include <time.h> /* header needed for time() */ int main() { srand(time(0)); for(int i=0;i<=9;i++) printf("%d\n",rand()); return 0; }
      

  2.   

    rand产生的不是真正的随机数,而是存在一个随机数分布表,每次都根据你给定的seed在表中进行一定的计算找出一个随机数来。要通过srand产生种子,不过srand(n),n每次都一样的话,给出的随机数还是一样的(上面那个里面用time(0)的方法要小心点,如果你多次调用并且调用间隔很小的话,就会产生一样的种子)……如果需要真正的随机数,查一下Intel的文档,Intel在自己的CPU里面实现了通过噪声电流产生随机数的一条指令。
      

  3.   

    .....Intel在自己的CPU里面实现了通过噪声电流产生随机数的一条指令  
    汗~~~~~
      

  4.   

    同意newbiestar() 的看法,的确“如果你多次调用并且调用间隔很小的话,就会产生一样的种子”。至于“通过噪声电流产生随机数的指令”,不知哪位高人有更多资料请说说看法。
      

  5.   

    .....Intel在自己的CPU里面实现了通过噪声电流产生随机数的一条指令我是来崇拜这句话的.
      

  6.   

    Intel在自己的CPU里面实现了通过噪声电流产生随机数的一条指令
    真的假的?没有研究过。
    我看到的资料都是说随机数是由算法根据种子产生的,所以如果你不改变随机种子,每次产生的随机序列都是一样的。
      

  7.   

    Intel在自己的CPU里面实现了通过噪声电流产生随机数的一条指令听说过。真正的随机数,只有通过硬件得到。
      

  8.   

    我承认,我记错了……不是CPU而是芯片组……有兴趣的google Intel RNG就可以知道了,不过有一点我没有说错,这个东西的确是硬件相关的……
      

  9.   

    一不小心用错马甲,给个URL作参考
    http://www.xfocus.net/articles/200209/451.html(中文的资料)有兴趣的自己到Intel.com去找找Intel的白皮书……
      

  10.   

    在用之前加一句:
    srand(time(NULL));