zoukankan      html  css  js  c++  java
  • C语言生成随机数

     强烈建议阅读 → 重新整理后的文章

    2012年的时候写过一篇C语言生成随机数的博客,点击量比较高。后来发现那篇博客描述的不是非常准确,这里重新整理一遍。写惯了高级语言,现在回看C的语法,真的是挺难的^o^。

    一、方法介绍

    生成随机数,需要用到两个函数srandrand,头文件为 #include <stdlib.h>

    1.1 void srand ( unsigned int seed )

    生成随机数种子,注意如果使用相同的种子后面的 rand() 函数会出现一样的随机数。常见的用法是使用一些动态的值来初始化这个种子:

    srand((unsigned) time(NULL));
    srand((int)getpid());

     

    1.2 int rand ( void )

    根据 srand 初始的随机数种子产生一个伪随机数(注意不是真正的随机),范围为 0 - RAND_MAX。RAND_MAX 至少为 32767,我电脑为 2147483647。可通过取模来产生不同范围的随机数,如:

    int randint = rand() % (MAX + 1 - MIN) + MIN;

    1.3 举例实现

    下面给出了一个举例的实现(POSIX.1-2001),帮助更好的理解其原理,每次调用rand的时候,其实是改变了一个全局变量,从而导致下一次调用返回了不同的值。

    static unsigned long next = 1;

    /* RAND_MAX assumed to be 32767 */
    int myrand(void) {
       next = next * 1103515245 + 12345;
       return((unsigned)(next/65536) % 32768);
    }

    void mysrand(unsigned seed) {
       next = seed;
    }

     

    二、代码举例

    2.2 使用同样的随机数种子

    #include <stdio.h>
    #include <stdlib.h>

    int main(int argc, char *argv[])
    {
       for (long i = 0; i < 10; i++){
      srand(1);
           printf("%d\n", rand());
      }
     
     return 0;
    }

    根据上面的API说明,猜猜这10个数字会怎样?

     

    2.3 使用不同的随机数种子

    这里不调用 srand ,或者调用一次,或者每次都调用,都会产生一定的随机效果。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int main(int argc, char *argv[])
    {
       srand((unsigned int)time(NULL));
       for (long i = 0; i < 10; i++){
           printf("%d\n", rand());
      }
     
     return 0;
    }

    三、小结

    随机数种子建议初始化生成一次,可以结合多个动态元素去初始化,结合具体的业务需求制定。因为这个种子会直接影响随机数的生成,如何使用不当,则达不到随机的效果。

    最后用 python 怎么实现这个随机需求呢?哈哈

    import random
    random.randint(1, 100)
    Stay hungry Stay foolish
  • 相关阅读:
    UI进阶--控制器View的创建流程以及生命周期方法
    UI进阶--程序启动原理和UIApplication
    UI进阶--常见的项目文件介绍
    浅析 KVO 内部实现
    浅析 Get 和 Post 的区别
    C++实现进制转换
    UIBlurEffect 毛玻璃特效实现
    UITableView左滑显示选择
    排序算法(OC实现)
    valid Palindrome -- leetcode
  • 原文地址:https://www.cnblogs.com/xiangzi888/p/2462300.html
Copyright © 2011-2022 走看看