zoukankan      html  css  js  c++  java
  • 随机数rand-如何正确生成随机数

    #include <stdio.h>

    //#include <Windows.h>

    int main(void)

    {

    int i;

    //srand((unsigned)time(NULL));//每次运行该程序时,如果当前秒数不同,则不同次运行生成的随机数不同,

    for (i = 0; i < 20; i++)    // 否则不同次运行生成的随机数是一样的

    {

    //srand(_getpid());

    srand((unsigned)time(NULL));//每次运行该程序时,如果当前秒数不同,则不同次运行生成的随机数不同,

    printf("%d ", rand() );//无论是否有种子,3个随机数都不一定会相同.

    printf("%d ", rand() );

    printf("%d ", rand() );

    printf("==================== ");

    //system("pause");

    }

    return 0;

    }

    结果:每次循环产生的随机数一样.如下图所示.

                                

      rand 是固定的迭代函数,对一个初始值不停嵌套计算,输出每次计算的结果。输出的序列有不错的统计性质,所以叫伪随机数。srand 就是设置这个初始值。不停地设置相同的初始值,rand 就总是初始值经过一次计算的结果,也就不会变。这是错误的用法。

    正确的用法,srand 一个程序只能调用一次。或者说一个线程只调用一次(对于常见的每个线程一个随机数发生器状态的 C 运行时库)。

    1.综上所述,注释掉for循环中的srand((unsigned)time(NULL)),使用for上一行的srand((unsigned)time(NULL)).

    2.time(NULL)每秒变化一次,如果在一秒内连续执行该程序2,2次得到的随机数一样.这时,可以使用_getpid()代替time(NULL)._getpid()(VS2015,LINUX下为getpid()),获取进程ID.

    不是尽力而为,而是全力以赴.
  • 相关阅读:
    HDU 1312 Red and Black(经典DFS)
    POJ 1274 The Perfect Stall(二分图 && 匈牙利 && 最小点覆盖)
    POJ 3041 Asteroids(二分图 && 匈牙利算法 && 最小点覆盖)
    HDU 1016 素数环(dfs + 回溯)
    HDU 1035 Robot Motion(dfs + 模拟)
    vjudge Trailing Zeroes (III) (二分答案 && 数论)
    openjudge 和为给定数(二分答案)
    图的存储
    二分查找
    快速选择算法
  • 原文地址:https://www.cnblogs.com/yang666/p/6400526.html
Copyright © 2011-2022 走看看