精华内容
下载资源
问答
  • C语言产生随机数是一个常见的编程功能任务,当然这个也不难,调用两三个函数就出来了,但是你知道这些函数具体是起到怎样的作用,并且是它们是如何产生随机数的吗? 几个概念 随机数:数学上产生的都是伪随机...
    
    

    C语言产生随机数是一个常见的编程功能任务,当然这个也不难,调用两三个函数就出来了,但是你知道这些函数具体是起到怎样的作用,并且是它们是如何产生随机数的吗?

    几个概念

    随机数:数学上产生的都是伪随机数,真正的随机数使用物理方法产生的。

    随机数种子:随机数的产生是由算术规则产生的,srand(seed)的随机数种子不同,rand()的随机数值就不同,倘若每次的随机数种子一样,则rand()的值就一样。所以要产生随机数,则srand(seed)的随机数种子必须也要随机的。

    用srand()产生随机数种子

    原型:void srand ( unsigned int seed );

    作用是设置好随机数种子,为了让随机数种子是随机的,通常用time(NULL)的值来当seed。

    用rand()产生随机数

    原型:int rand ( void );

    作用是产生一个随机数,当然随机数是有范围的,为0~RAND_MAX之间,随机数与随机数种子有关。具体来说是,在产生随机数 rand()被调用的时候,它会这样执行:

    • 如果用户之前调用过 srand(seed)的话,他会重新调用一遍 srand(seed)以产生随机数种子;
    • 如果发现没有调用过 srand(seed)的话,会自动调用 srand(1)一次。
    • 如果调用srand(seed)产生的随机数种子是一样的话(即seed的值相同),rand()产生的随机数也相同。

    所以,如果希望rand()每次调用产生的值都不一样,就需要每次调用srand(seed)一次,而且seed不能相同。这里就是经常采用time(NULL)产生随机数种子的原因。

    time()用于随机数种子

    函数原型:time_t time ( time_t * timer );

    time()函数表示返回1970-1-1 00:00:00 到当前时间的秒数。

    用的时候这样:srand(unsigned(time(NULL)));例如产生1~10之间的随机整数

    #include <stdlib.h>
    #include <time.h>
    
    int main()
    {
        srand(time(NULL));
        for(int i=0;i < 10;i++)
        {
            int randValue=rand()%10;
        }
    }

    上面的程序中要注意srand是在for循环外面的,如果把srand放到for循环里面,则每次产生的随机数都相同。

    展开全文
  • 语言产生随机数是一个常见的编程功能任务,当然这个也不难,调用两三个函数就出来了,但是你知道这些函数具体是起到怎样的作用,并且是它们是如何产生随机数的吗? 几个概念 随机数:数学上产生的都是伪随机数,真正...
  • 语言产生随机数是一个常见的编程功能任务,当然这个也不难,调用两三个函数就出来了,但是你知道这些函数具体是起到怎样的作用,并且是它们是如何产生随机数的吗? 几个概念 随机数:数学上产生的都是伪随机数,...

    转自:http://www.jb51.net/article/75741.htm

    语言产生随机数是一个常见的编程功能任务,当然这个也不难,调用两三个函数就出来了,但是你知道这些函数具体是起到怎样的作用,并且是它们是如何产生随机数的吗?

    几个概念

    随机数:数学上产生的都是伪随机数,真正的随机数使用物理方法产生的。

    随机数种子:随机数的产生是由算术规则产生的,srand(seed)的随机数种子不同,rand()的随机数值就不同,倘若每次的随机数种子一样,则rand()的值就一样。所以要产生随机数,则srand(seed)的随机数种子必须也要随机的。

    用srand()产生随机数种子

    原型:void srand ( unsigned int seed );

    作用是设置好随机数种子,为了让随机数种子是随机的,通常用time(NULL)的值来当seed。


    time()用于随机数种子

    函数原型:time_t time ( time_t * timer );

    time()函数表示返回1970-1-1 00:00:00 到当前时间的秒数。

    用的时候这样:srand(unsigned(time(NULL)));例如产生1~10之间的随机整数

    #include <stdlib.h>
    #include <time.h>
     
    int main()
    {
      srand(time(NULL));
      for(int i=0;i < 10;i++)
      {
        int randValue=rand()%10;
      }
    }

    上面的程序中要注意srand是在for循环外面的,如果把srand放到for循环里面,则每次产生的随机数都相同。

    用rand()产生随机数

    原型:int rand ( void );

    作用是产生一个随机数,当然随机数是有范围的,为0~RAND_MAX之间,随机数与随机数种子有关。具体来说是,在产生随机数 rand()被调用的时候,它会这样执行:

    如果用户之前调用过 srand(seed)的话,他会重新调用一遍 srand(seed)以产生随机数种子;
    如果发现没有调用过 srand(seed)的话,会自动调用 srand(1)一次。
    如果调用srand(seed)产生的随机数种子是一样的话(即seed的值相同),rand()产生的随机数也相同。
    所以,如果希望rand()每次调用产生的值都不一样,就需要每次调用srand(seed)一次,而且seed不能相同。这里就是经常采用time(NULL)产生随机数种子的原因。

    C语言中可以使用rand()函数来生成一个从0到RAND_MAX的uniform分布。基于这个函数,我们可以构造出一些特定的随机数生成器来满足我们的需求。
    (一)0到1的uniform分布:

    //generate a random number in the range of [0,1]
    double uniform_zero_to_one(){
      return (double)rand()/RAND_MAX;
    }

    (二)任意实数区间的uniform分布:

    //generate a random real number in [start,end]
    double uniform_real(double start,double end){
      double rate=(double)rand()/RAND_MAX;
      return start+(end-start)*rate;
    }

    (三)任意整数区间的uniform分布:

    //generate a random integer number in [start,end)
    int uniform_integer(int start,int end){
      int base=rand();
      if(base==RAND_MAX)
        return uniform_integer(start,end);
      int range=end-start;
      int remainder=RAND_MAX%range;
      int bucket=RAND_MAX/range;
      if(base<RAND_MAX-remainder)
        return start+base/bucket;
      else
        return uniform_integer(start,end);
    }

    这个函数要特别说明一下,平常时候我们都是用rand()%n来生成0到n-1的随机数,但是按这种方法生成的分布并不是uniform的,另外由于RAND_MAX只有32767,因此要生成比这个数更大的随机数需要另外想办法,理论上可以直接用0到1的uniform分布直接放缩,但实际效果不好。这里给出一种移位方式的实现。

    (四)32bits的随机数

    //generate a random 32 bits integer number 
    int rand32(){
      return ((rand()<<16)+(rand()<<1)+rand()%2);
    }

    有了32bits的随机数生成方法,就可以构造32bits范围内的随机整数区间了,方法和之前16bits的情况一样。

    (五)32bits范围内的随机整数区间

    //generate a random 32bits integer number in [start,end)
     int uniform_integer_32(int start,int end){
       int base=rand32();
      if(base==RAND32_MAX)
        return uniform_integer_32(start,end);
      int range=end-start;
      int remainder=RAND32_MAX%range;
      int bucket=RAND32_MAX/range;
      if(base<RAND32_MAX-remainder)
        return start+base/bucket;
      else
        return uniform_integer_32(start,end);
    }

    这里RAND32_MAX定义为0x7fffffff。

    除此之外,利用rand()函数构造任意分布的随机数也是个值得探讨的问题。

    理论上可以通过(0,1)的uniform分布,加上标准采样方法(sampling)获得。

    展开全文
  • C语言5--函数,随机数

    2021-01-18 17:25:20
    2.C语言随机数的使用 C语言提供了一组标准函数来产生伪随机数 标准函数rand()可以获取伪随机数 把rand函数的调用语句(rand())当数字使用就能得到一个伪随机数 使用rand函数需要包含stdlib.h头文件 rand() --------...

    随机数

    1.概念
    无法预测的数字叫随机数
    计算机可以通过算法提供一些看起来无法预测的数字,我们一般叫伪随机数

    2.C语言中随机数的使用
    C语言提供了一组标准函数来产生伪随机数
    标准函数rand()可以获取伪随机数
    把rand函数的调用语句(rand())当数字使用就能得到一个伪随机数
    使用rand函数需要包含stdlib.h头文件
    rand() ------------ 随机数

    rand函数通过一个参数(种子)运算得到一个随机数序列,每次调用rand函数从序列中取出一个数据来使用。
    使用同样的种子得到同样的随机数序列,为了避免该情形应该每次运行程序设置不同的种子。
    标准函数srand()用来设置随机数种子(整数),用法如下:
    srand(种子);

    使用srand函数需要包含stdlib.h头文件
    注:设置种子的srand函数在一个程序中只应该调用一次,而且应该在程序开头调用。

    使用系统时间作为种子可以让每次运行程序得到的随机数序列不同。
    标准函数time()可以获取当前系统时间,用法如下:
    time(0);

    使用time标准函数需要包含头文件time.h

    函数

    1.概念
    C语言使用函数包含一组相关的语句
    所有的C语言程序都是由一个或多个函数组成,C程序就是一些函数的集合
    使用函数不但可以简便代码的管理和维护,也能提高代码的复用性

    每个函数都是名字,叫函数名,一个C程序中不允许有函数名相同
    函数名也属于标识符,遵循标识符的规范,函数名本身代表第一条语句的地址。
    每个C语言程序必须包含一个叫main的函数,叫主函数,程序从主函数的第一条语句开始执行,当主函数最后一条语句执行完毕程序结束。

    2.函数调用
    C语言的函数之间可以互相合作,合作一定发生在两个函数之间,函数与函数的合作是有时间范围的。
    两个函数之间的一次合作叫函数调用,发起合作的函数叫调用函数,另一个叫被调用函数。
    函数调用期间通常伴随着数据的传递

    (1)返回值
    返回值记录函数执行结束后遗留的数字,记录在返回值中的数字能够让调用函数得到。把函数调用语句当数字使用就得到了被调用函数的返回值。
    设计函数可以选择是否使用返回值,返回值的类型在函数定义是写在函数名之前,如果函数没有返回值应该在函数名前加void。
    任何函数的的返回值最多一个,通过return设置返回值应该在函数的最后一步完成。

    (2)函数的参数
    被调用函数可以通过一组形式参数获得调用函数提供的数据
    形式参数的个数任意,形式参数和返回值一样,都是被调用函数提供的
    调用函数提供一组实际参数,实际参数的个数和类型必须和形式参数一致
    C语言通过将实际参数赋值给形式参数来完成数据的传递,形式参数必须是左值,实际参数必须是右值
    在函数定义时,形式参数的声明写在函数名后的小括号里(多个形参的声明用逗号分开),多个同类型形参的声明不能省略后面的形参类型。

    (3)函数定义,调用和声明的语法
    函数定义指的是函数的实现,函数调用表示去执行函数,函数调用前必须先声明。
    函数定义语法:
    返回值类型 函数名(形参列表)
    {
    函数语句;
    }

    函数调用语法:
    函数名(实参列表);

    函数声明语法:
    返回值类型 函数名(形参列表);

    (4)函数形参补充
    形式参数在函数调用被创建,函数返回后销毁,形式参数的数据来自于实参
    在函数中队形参进行修改不会影响实参,使用普通变量作为形参只能实现值的单向传递(调用函数=====>被调用函数)
    注:在形参列表写void表示该函数没有参数,如果形参列表为空表示形参的个数和类型任意。函数声明可以省略形参名。

    3.数组作为形参
    数组作为形参传递的数据是地址,调用函数和被调用函数就共享一组存储位置。

    如果被调用函数在函数中修改了数组形参的内容,函数结束后这些修改能够被调用函数得到。原因就是数组作为形参传递的是数组的地址(数组名),与数组形参对应的配对的实参也是地址。

    普通变量作为形参只能将数据从调用函数传递给被调用函数,这种参数叫输入参数。
    数组作为形参可以实现数据的双向传递,这种参数叫输入输出参数。
    注:如果使用数组作为形参必须提供另外一个参数传递数组元素个数,避免使用非法下标。

    4.补充内容
    (1)函数隐式声明
    如果编译器在编译时先遇到函数调用语句,编译器就会使用隐式声明去推断函数的格式。
    隐式声明中,形参类型和个数任意,返回值类型为int
    int 函数名();

    隐式声明不可靠,在编程中不要使用
    (2)inline函数(内联函数)
    一个函数可以被声明为inline函数,inline函数在被调用时,会优先选择使用代码替换而不是函数调用。
    使用inline函数时要么使用static进行修饰,要么调用前必须先声明,否则语法错误。

    何时使用inline函数
    函数语句体不超过10行
    语句中没有循环,递归等复杂的语法

    注:inline声明只是对编译器的一种建议,最终是否要使用inline由编译器决定

    (3)exit标准函数
    exit是一个标准函数,使用它需要包含stdlib.h头文件
    exit函数的作用就是立即结束程序的运行,相当于在主函数中return

    展开全文
  • 随机数

    2011-09-01 16:01:06
    C语言随机数应用  2010-01-31 00:04:06| 分类: 业余学习 |字号 订阅  当我们要用到随机数时,通常是要用到C程序库中所提供rand() ,但因为其“伪”性,所以如果要产生真正随机序列必须要...

    C语言随机数应用  

    2010-01-31 00:04:06|  分类: 业余学习 |字号 订阅

      当我们要用到随机数时,通常是要用到C程序库中所提供的rand() ,但因为其“伪”性,所以如果要产生真正的随机序列必须要了解“ 种子”的概念。开始的时候这个“种子”是我不知道的。如今总算找到了答案。

          因为随机数产生函数 rand()(函数原型int rand(void);)的机理是通过一个静态全局变量来产生的,即种子。默认情况下种子 = = 1;如下:

          ststic unsigned long int next = 1;     //种子

          int rand ( void)

          {

                next = next * 1103515245 + 12345;

                return (unsigned int ) (next / 65536) % 32768; //可见产生的随机数是不大于 32768;

          } 

          可见每次调用此函数的时候产生的数当然就一样咯。

         所以就又有了个重置种子的第二个函数 srand ().(函数原型 void srand(unsigned int seed));来帮助rand()了,但这往往还是达不到我们的要求,因为我们只有每次通过重置种子来改变产生的随机数,这常常显得比较麻烦。

         void srand(unsigned int seed)
        {
                next = seed;
        }

         要是可以自动重置种子该多好啊。这是可行的。因为一个系统的时钟往往是在不断的变化的。因此可以通过一个能够从系统时钟中得到不同返回值的函数time()来初始化种子。

         #include <time.h>

          srand((unsigned int) time(0))

         这样就可以随着每次的rand()而产生不同的随机数了。

     

    如产生1000以内随机数:

    int getrand(void)                              /*产生随机数*/
    {
        srand(time(NULL));
        return rand()%1000+1;
    }  

    这个函数可以产生1到1000之间的真随机数


    展开全文
  • 既然我们已经了解了真伪随机数的概念,接下来就来探究一下离我们最近的伪随机数吧。 c语言中就存在一个随机函数:rand().它就是一个标准的伪随机数生成器。依赖的头文件是stdlib.h. 接下来我就使用rand函数,来试着...
  • C语言整数

    2020-04-25 22:50:56
    文章目录一、整数的概念二、整数的取值范围三、整数的输出四、二进制数、八进制数和十六进制数的书写1、二进制2、八进制3、十六进制4、需要注意的坑五、常用的库函数六、数据类型的别名七、随机数1、生成随机数2、...
  • C语言的科学和艺术.pdf

    热门讨论 2012-01-19 14:09:05
    8.2.4 改变随机数的范围 206 8.2.5 将此问题通用化 210 8.3 在库中保存工具 212 8.3.1 接口的内容 212 8.3.2 写random.h接口 213 8.3.3 random.c的实现 214 8.3.4 构造客户程序 215 8.3.5 初始化随机数发生器...
  • 1. 数据结构的概念 2. 堆栈 3. 深度优先搜索 4. 队列与广度优先搜索 5. 环形队列 13. 本阶段总结 II. C语言本质 14. 计算机中数的表示 1. 为什么计算机用二进制计数 2. 不同进制之间的换算 3. 整数的加减运算 3.1. ...
  • C语言中或其他语言中等价rand()、srand()有所了解。本文不讨论种子设定和伪随机数问题; 2.中学或以上水平概率基本概念。 目录 利用随机数函数生成随机数 利用随机数函数...
  • C语言讲义.doc

    2018-01-27 10:41:43
    1.1.1 指针的概念 52 1.1.2 指针变量的定义 52 1.1.3 &取地址运算符 52 1.1.4 无类型指针 52 1.1.5 NULL 53 1.1.6 空指针与野指针 53 1.1.7 指针的兼容性 53 1.1.8 指向常量的指针与指针常量 54 1.1.9 指针与数组的...
  • C语言中rand函数

    2016-07-02 10:52:39
    rand函数功能为获取一个伪随机数(伪随机数的概念下面会有介绍)。 一、函数名:  rand(); 二、声明: int rand(); 三、所在头文件: stdlib.h 四、功能: 返回一个伪随机数。之所以说是伪随机数,是因为在没有...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    虽然C语言是最普遍一种高级语言,但不同MCU厂家其C语言编译系统是有所差别,特别是在一些特殊功能模块操作上。如果对这些特性不了解,那调试起来就有烦了,到头来可能还不如用汇编来的快。 5. 在教学中...
  • 记一下 我也记记 这是第一次(藐视小企鹅);好像是这个星期总结吧,应该是 ...概念 ,利用时间戳进行播种,导致每一秒数组都不同,然后进行处理就行了 全部代码片 #include<stdio.h> #include<std...
  • C适用范围扩大、在这些年中语言改变和各个组织开发超出其预定内容编译器,所有这一切要求对C语言有一个比本书第1版更精确和更新定义。在1983年,美国国家标准协会(ANSI)成立了一个委员会,它目标是...

空空如也

空空如也

1 2 3 4 5
收藏数 98
精华内容 39
关键字:

c语言随机数的概念

c语言 订阅