C语言中随机数相关问题

用C语言产生随机数重要用到rand函数、srand函数、及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明。

int rand(void);//生成一个随机数

voidsrand(unsigned int seed); //为rand设置“种子”的值

srand()就是给rand()提供种子seed,如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的。通常的做法是以这样一句代码:

srand((unsigned)time(NULL));

来取代,这样将使得种子为一个不固定的数,这样产生的随机数就不会每次执行都一样了。先看一个例子:

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

 

int test_rand()

{

   int i;

   /* Seed therandom-number generator with current time so that

   * thenumbers will be different every time we run.

   */

   srand((unsigned)time( NULL ) );

   /* Display10 numbers. */

   for( i = 0;i < 10; i++ )

       printf("%6d\n", rand());

   return 0;

}

C的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进rand函数的实现中,可能有如下原因:

1.可以高效产生连续的随机数,不用每次都初始化;

2.给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据做种子,而不是系统时钟;

3.对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不了程序每次运行都产生同样的一系列随机数而已——有些情况下,这是无所谓的。

4.作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是:产生的序列必须是可重现的。这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中使用了和rand()的结果相关的数据,通过一个可控的可重现序列,我们就有机会再现每一次测试的过程,从而更有效的找到问题的所在。所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么,必须保证你的rand()调用是可重现的。

另外使用rand还用几个问题:

如何生成 0到
100之间的随机数?

用"int x = rand() % 100;"这种方法是不或取的,会使产生的随机数不在随机。产生一个0到n之间的随机数的比较好的做法是:

j=(int)(n*rand()/(RAND_MAX+1.0));

如何产生一个范围在(a,b)之间的随机数?

先计算a与b的差值,设c=b-a;产生一个介于0和b-a的数值,设

d=(int)((b-a)*rand())/(RAND_MAX+1.0)

让上面产生的值d加上a就可以了。

如果你使用C++11编程,请使用C++11自己的随机数生成方法!

虽然前面介绍了那么多,但是我还是想说C语言的随机数生成方法有很多缺陷,很容易被引入非随机性,而且功能单一,如果可以的话去,你最好避免使用它。

C语言中随机数相关问题,布布扣,bubuko.com

时间: 2024-12-24 11:44:04

C语言中随机数相关问题的相关文章

【编程开发】C语言中随机数rand使用注意事项

[编程开发]C语言中随机数rand使用注意事项 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语言中的rand函数为例,使用时需要注意随机数的随机体现在哪里,比如是程序在不同的时刻执行时,相同位置的随机数是否需要一样,还是要每次执行生成的随机数也要不一样,等等,这些都是需要加以关注的地方. 经测试,发现,在不使用srand这个随机数种子的情况下:每次运行生成的随机数都是一样的.有的时候是需要这样子的,当然可以直接使

c语言中条件编译相关的预编译指令

一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二.条件编译 条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段.可根据表达式的值或某个特定宏是否被定义来确定编译条件. 最常见的条件编译是防止重复包含头文件的宏,形式跟下面代码类似: 1 #ifndef ABCD_H 2 #define ABCD_H 3 4 // ... some declarat

c语言中文件相关操作

一 .首先介绍一下数据文件的类型: 1.二进制文件(映像文件):在内存中以二进制形式存取. 2.文本文件(ascii文件):以ascii码形式存取的文件. 通俗的讲,在Mac下,你把一个文件丢进记事本里面,如果打开是乱码就是二进制文件. 二.其次是文件类型指针: 简单的说文件类型指针就是存储文件信息的地址. 文件类型指针变量:定义一个指针类型的变量,用来指向存储文件信息的地址.用FILE定义.比如: FILE * fp 三.文件操作步骤(c语言中所有用到的函数都是f开头的.): 1.打开文件 f

C语言中数学相关知识点

快速求幂取模 积的取余等于取余的积取余 代码如下: int pow(int a,int n,int b)//返回值是a的n次方对b取余后的值 {     int result=1;     a=a%b;//积的取余等于取余的积取余     while(n>0)     {         if(n%2==1)             result=result*a%b;//n是奇数的话就要多乘一次,原理和前面的二分求幂一样         n=n/2;//二分         a=a*a%b;/

C语言中如何产生随机数

今天看到一段小程序 ,里面用到随机数.才发现在C语言中产生随机数不像matlab中那么简单. C中也有rand()函数,但是rand()函数产生的数不是真正意义上的随机数,是一个伪随机数,是根据一个数,我们称它为种子,为基准以某个递推公式推算出来的一系列数.范围在0~RAND_MAX之间.RAND_MAX和rand()一样也定义在stdlib.h中,其值至少为32767.当计算机正常开机后,种子是固定了的.所以如果不结合其他函数,使用rand()产生随机数就会出现以下情况: 1 #include

【C】C语言中文件操作相关内容

1. 文件和流的关系 C将每个文件简单地作为顺序字节流.每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件的关系. 在开始执行程序的时候,将自动打开3个文件和相关的流:标准输入流.标准输出流和标准错误.流提供了文件和程序的通信通道.打开一个文件将返回指向FILE结构(在stdio.h中定义)的指针,它包含用于处理文件的信息,也就是说,这个结构包含文件描述符.文件描述符是操作系统数组(打开文件列表的索引).每个数组

c语言中实现从0-1的随机数输出

原文:c语言中实现从0-1的随机数输出 今天晚上同学问了一个巨简单的问题,问我怎么用c语言输出0-1的随机数,可别说,一时之间还想不出来.在写的过程中发现,直接调用random函数还不能实现,用以下方法可以解决: #include<stdio.h> #include<time.h> #include<stdlib.h> int main() { int i; srand(time(NULL)); printf("%lf\n",(double)rand

原码、反码、补码相关内容以及Java语言中是以哪一种码表示的

计算机中的数字是以二进制方式存储的,第一个二进制位为符号位,0代表正数,1代表负数 原码.反码.补码是计算机中存储数字使用的编码 1.原码.反码.补码的概念 原码:符号位加上这个数绝对值 例如正整数1的8位二进制原码为 00000001      负整数-1的8为二进制原码为 10000001 反码:正数的反码就是其本身,负数的反码就是在原码的基础上除符号位外所有的位取反 例如正整数1的8位二进制原码为 00000001 则其反码还为 00000001  负整数-1的8为二进制原码为 10000

C/C++ 中随机数的用法

本文分两部分,先介绍 C 语言中与随机数相关的两个函数 srand 和 rand,后介绍 C++ 中的 random 库. 1.C 语言中的 srand 和 rand 1)实现 下面是 VC 的实现: [cpp] view plaincopyprint? #define RAND_MAX 32767  // in <stdlib.h> unsigned long _Randseed = 1;    // global seed void srand(unsigned int seed) { _