C语言程序设计 伪随机数的产生

合集下载

CC++中如何产生伪随机数

CC++中如何产生伪随机数

CC++中如何产⽣伪随机数 本节主要参考⾃⼀及. 我们知道rand()函数可以⽤来产⽣随机数,但是这不是真正意义上的随机数,是⼀个伪随机数,是根据⼀个数(我们可以称它为种⼦)为基准以某个递推公式推算出来的⼀系列数,当这系列数很⼤的时候,就符合正态公布,从⽽相当于产⽣了随机数,但这不是真正的随机数,当计算机正常开机后,这个种⼦的值是定了的,除⾮你破坏了系统。

1.1 rand() 功能:随机数发⽣器 ⽤法:int rand(void) 所在头⽂件: stdlib.h rand()的内部实现是⽤线性同余法做的,它不是真的随机数,因其周期特别长,故在⼀定的范围⾥可看成是随机的。

rand()返回⼀随机数值的范围在0⾄RAND_MAX 间。

RAND_MAX的范围最少是在32767之间(int)。

⽤unsigned int 双字节是65535,四字节是4294967295的整数范围。

0~RAND_MAX每个数字被选中的机率是相同的。

⽤户未设定随机数种⼦时,系统默认的随机数种⼦为1。

rand()产⽣的是伪随机数字,每次执⾏时是相同的;若要不同,⽤函数srand()初始化它。

1.2 srand() 功能:初始化随机数发⽣器 ⽤法: void srand(unsigned int seed) 所在头⽂件: stdlib.h srand()⽤来设置rand()产⽣随机数时的随机数种⼦。

参数seed必须是个整数,如果每次seed都设相同值,rand()所产⽣的随机数值每次就会⼀样。

1.3 使⽤当前时钟作为随机数种⼦ rand()产⽣的随机数在每次运⾏的时候都是与上⼀次相同的。

若要不同,⽤函数srand()初始化它。

可以利⽤srand((unsigned int) (time(NULL))的⽅法,产⽣不同的随机数种⼦,因为每⼀次运⾏程序的时间是不同的。

1.4 产⽣随机数的⽤法 1)给srand()提供⼀个种⼦,它是⼀个unsigned int类型; 2)调⽤rand(),它会根据提供给srand()的种⼦值返回⼀个随机数(在0到RAND_MAX之间); 3)根据需要多次调⽤rand(),从⽽不间断地得到新的随机数; 4)⽆论什么时候,都可以给srand()提供⼀个新的种⼦,从⽽进⼀步“随机化”rand()的输出结果。

c语言随机数生成器使用方法

c语言随机数生成器使用方法

c语言随机数生成器使用方法C语言随机数生成器是一种用来生成随机数的工具。

在C语言中,我们可以使用stdlib.h头文件中的rand()函数来生成伪随机数。

本文将介绍如何使用C语言的随机数生成器,并提供一些常见的用例和技巧。

##随机数的概念随机数是指在一定范围内,按照一定规律随机生成的数值。

在计算机领域,我们通常将随机数分为真随机数和伪随机数。

真随机数是完全由随机性产生的数值,这种随机性可以来自于物理过程,例如测量微弱的电磁波干扰、大气噪声、光子计数等。

真随机数具有不可预测性和不确定性,但是它们往往难以获得,并且会消耗大量的计算资源。

因此,在计算机中常用的是伪随机数。

伪随机数是通过确定性的算法生成的数值,它们在一定程度上模拟了真随机数的随机性。

伪随机数的生成算法通常依赖于一个称为随机数生成器的函数,并且可以通过指定一个种子值来控制生成的随机数序列。

在C语言中,rand()函数就是一个伪随机数生成器。

## C语言随机数生成器的使用在C语言中,要使用随机数生成器,首先需要引入stdlib.h头文件:```c#include <stdlib.h>```然后,就可以使用rand()函数来生成随机数。

rand()函数会返回一个范围在0到RAND_MAX之间的伪随机整数值。

RAND_MAX是一个常量,表示伪随机数生成器能够生成的最大随机数。

下面是一个简单的例子,演示如何使用rand()函数生成随机数:```c#include <stdio.h>#include <stdlib.h>int main(){int i;for (i = 0; i < 10; i++){int random_num = rand();printf("%d\n", random_num);}return 0;}```运行该程序,会输出10个随机整数,范围在0到RAND_MAX之间。

wincc 随机数 c语言

wincc 随机数 c语言

wincc 随机数c语言
在C语言中,可以使用rand()函数生成随机数。

rand()函数在stdlib.h 头文件中定义,它可以生成一个伪随机整数。

要在WinCC中使用C语言生成随机数,需要使用WinCC提供的API 函数来调用C语言的rand()函数。

下面是一个简单的示例代码,用于生成一个0到99之间的随机数:
```c
#include <stdio.h>
#include <stdlib.h>
void GenerateRandomNumber()
{
int randomNumber = rand() % 100; //生成0到99之间的随机数printf("随机数为:%d\n", randomNumber);
}
```
在上面的代码中,rand()函数生成一个伪随机整数,然后使用模运算符(%)将其限制在0到99之间。

最后,使用printf()函数将随机数
输出到控制台。

要在WinCC中使用上面的代码,需要将其嵌入到WinCC的脚本中,并使用WinCC提供的API函数来调用GenerateRandomNumber()函数。

具体实现方式可以参考WinCC的文档和示例代码。

伪随机数的生成

伪随机数的生成

<cstdlib>头文件定义了一个生成随机整数的函数rand()。

Rand()函数把一个随机整数返回为int类型。

Rand()函数返回的值是从0到RAND_MAX之间的一个值。

RAND_MAX是一个在<cstdlib>中定义的符号。

在代码中使用RAND_MAX时,编译器会用一个整数值代替它。

在一些系统中,它表示值0x7fff,在另外一些系统中,它有不同的值,它至多可以是0x7fffffff。

数字序列的随机化:<cstdlib>中定义的srand()函数,例:std::srand(13);srand()函数的变元必须是unsigned int 类型的值,这条语句将会使rand()产生一个与默认不同的序列。

<ctime>标准库头文件定义了几个与日期和时间相关的函数。

例:time()函数,因为这就是获得随机种子值的方式。

Time()函数返回自从1970年1月1日以来过去的秒数。

伪随机数的产生:例:假定希望随机整数在0到10之间,就可以从rand()返回的值中得到如下结果:Const int limit=11;Int random_value=static_cast<int>((limit*static_cast<long>(std::rand()))/(RAND_MAX+1L));这里把0到RAND_MAX的取值范围分成limit部分,在给定的部分中,rand()返回的所有值都在0到limit-1的范围内。

具体方法是,把limit乘以rand()/(RAND_MAX+1L),除以(RAND_MAX+1L)而不是RAND_MAX(),是为了处理rand()正好返回RAND_MAX的情况。

如果除以RAND_MAX,结果就是limit,而不是limit-1。

如果希望随机值在1和某个上限之间,而不是下限为0,就应使用下面的代码:Const int limit=100;Intrandom_value=static_cast<int>(1L+(limit*static_cast<long>(std::rand()))/(RAND_MAX+1L));这里使用与前面相同的表达式生成0到limit-1之间的值,然后给它加1,得到1到limit之间的值。

c 随机数 函数

c 随机数 函数

在C语言中,你可以使用标准库中的`rand()`函数生成伪随机数。

以下是一些关于C语言中随机数生成的基本信息:1. **头文件:** 为了使用`rand()`函数,你需要包含头文件`#include <stdlib.h>`。

2. **随机数种子:** 在使用`rand()`函数之前,通常需要调用`srand()`函数设置一个随机数种子。

可以使用`time(NULL)`来获取当前时间作为种子,使得每次程序运行时生成的随机数序列不同。

```c#include <stdlib.h>#include <time.h>int main() {srand(time(NULL)); // 使用当前时间作为随机数种子// 其他代码return 0;}```3. **生成随机数:** 使用`rand()`函数可以生成一个0到`RAND_MAX`之间的伪随机整数。

```c#include <stdlib.h>int main() {int randomNumber = rand(); // 生成伪随机整数// 其他代码return 0;}```4. **限制范围:** 如果你需要在特定范围内生成随机数,可以使用取余操作来调整范围。

```c#include <stdlib.h>#include <time.h>int main() {srand(time(NULL)); // 使用当前时间作为随机数种子int min = 1;int max = 100;int randomNumber = rand() % (max - min + 1) + min; // 生成1到100之间的随机数// 其他代码return 0;}```请注意,`rand()`生成的是伪随机数,不是真正的随机数。

在相同的种子下,`rand()`将生成相同的随机数序列。

如果需要更高质量的随机数,可以考虑使用C标准库中的`<random>`头文件中的更先进的随机数生成器。

第2章 伪随机数的产生

第2章 伪随机数的产生

0
2
x 24
1

ln U
21
四.逆变法与其它分布随机数的产生(6)
思考1:
爱尔朗(Erlang)分布是m个负指数分布的 和。设 Y1 , Y2 ,Ym 为负指数分布,则
X Y1 Y2 Ym 为Erlang分布。试设计
其随机数的产生。
22
四.逆变法与其它分布随机数的产生(6)
Answer:
II. A 5, S 1
0
III. A 3, S 2
0
S {2, 6, 2, 6, ...}
8
二.产生U(0,1)的乘同余法(4)
3. 计算举例
若想产生U(0,1),则令 S / M 即可。
i i
I. A 3, S 1
0
{1 / 16, 3 / 16, 9 / 16,11 / 16, ...}
一般n取12,则:
z

i 1
12
y i 6 N 0,1
若想产生服从一般正态分布 的随机数 x,则只需产生 z N (0,1) ,再按公式
2
N ( , )
x z
即可获得。
15
四.逆变法与其它分布随机数的产生(1)
1. 逆变法
密度函数
U (0,1)
分布函数
f ( x)
L
初始参数取值:M 2 , 4 k + 1 ,C与M互为 A 质数,则可以获得最长的随机数序列长度为 2
L
上例中,若M=16,A=5,C=3,则产生的随机 整数序列?
10
三.正态分布N(0,1)的产生(1)
f ( x) N (0,1)

c 随机数 算法

c 随机数 算法

c 随机数算法C语言中的随机数算法是一种非常重要的算法,它可以生成一系列随机数,被广泛应用于各种领域,如游戏开发、密码学、模拟实验等。

本文将介绍C语言中常用的随机数算法,包括伪随机数生成和真随机数生成,并探讨它们的实现原理和应用场景。

一、伪随机数生成算法伪随机数生成算法是一种通过确定性的算法生成看似随机的数列的方法。

在C语言中,常用的伪随机数生成算法是线性同余法。

该算法基于数学公式Xn+1 = (aXn + b) mod m,其中Xn是当前的随机数,a、b和m是事先设定的常数。

这个公式的关键在于选取合适的a、b和m,以产生具有良好随机性质的数列。

在C语言中,使用rand()函数来生成伪随机数。

rand()函数的原理是基于线性同余法,它使用一个内部的随机数种子来产生随机数。

在每一次调用rand()函数时,种子都会被更新,并且下一次调用rand()函数时将使用更新后的种子来生成新的随机数。

这样就可以产生看似随机的数列。

伪随机数生成算法在很多情况下可以满足需求,但是在一些对随机性要求非常高的场景下,伪随机数可能无法满足要求。

因此,我们还需要了解真随机数生成算法。

二、真随机数生成算法真随机数生成算法是一种通过物理过程生成真正随机数的方法。

在C语言中,可以通过访问操作系统提供的随机数接口来获取真随机数。

这些接口通常会利用硬件设备中的物理过程,如热噪声、光电效应等,来产生随机数。

在Linux系统中,可以使用/dev/random或/dev/urandom设备来获取真随机数。

其中,/dev/random设备产生的随机数更加随机,但是当熵池(entropy pool)用尽时,读取操作会被阻塞,直到熵池重新积累足够的随机性。

而/dev/urandom设备则没有这个限制,但是它的随机性可能相对较弱。

在Windows系统中,可以使用CryptGenRandom函数来获取真随机数。

真随机数生成算法的随机性非常高,可以满足各种对随机性要求非常严格的场景,如密码学中的密钥生成、加密算法等。

c语言伪随机数生成算法

c语言伪随机数生成算法

c语言伪随机数生成算法C语言中常用的伪随机数生成算法包括线性同余发生器、梅森旋转算法和龙模算法等。

1. 线性同余法:线性同余发生器是一种基于线性递归的伪随机数生成器。

其算法基本原理是将当前数值与一个常数a相乘再加上一个常数c,再对m取模,得到下一个数值。

具体伪代码如下:seed = 设置初始种子a = 设置常数ac = 设置常数cm = 设置常数mnext = (seed * a + c) % mseed = next2. 梅森旋转算法:梅森旋转算法是一种基于循环移位的伪随机数生成算法,它利用梅森素数进行计算。

具体伪代码如下:state = 种子数W = 计算梅森素数function generateRandomNumber():if state < W:state = 计算下一个数else:state = 计算下一个数return state3. 龙模算法:龙模算法是一种结合线性同余发生器和移位发生器的伪随机数生成算法。

具体伪代码如下:state = 初始种子a = 设置常数ac = 设置常数cm = 设置常数mw = 设置常数wfunction generateRandomNumber():state = (state * a + c) % mrandomBits = state >> wstate = ((state & 0xFFFFFFFF) << (32-w)) randomBitsreturn randomBits需要注意的是,这些算法都是伪随机数生成算法,因为它们的结果是通过确定性的计算得到的,并不是真正的随机数。

用C语言产生伪随机数的方法总结

用C语言产生伪随机数的方法总结

标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数:函数一:int rand(void);从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。

函数二:void srand(unsigned seed);参数seed是rand()的种子,用来初始化rand()的起始值。

可以认为rand()在每次被调用的时候,它会查看:1)如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。

2)如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。

根据上面的第一点我们可以得出:1)如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。

2)否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值。

3)如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。

举几个例子,假设我们要取得0~6之间的随机整数(不含6本身):例一,不指定seed:for(int i=0;i<10;i++){ran_num=rand() % 6;cout<<ran_num<<" ";}每次运行都将输出:5 5 4 4 5 4 0 0 4 2例二,指定seed为定值1:srand(1);for(int i=0;i<10;i++){ran_num=rand() % 6;cout<<ran_num<<" ";}每次运行都将输出:5 5 4 4 5 4 0 0 4 2跟例子一的结果完全一样。

c语言随机数 底层逻辑

c语言随机数 底层逻辑

c语言随机数底层逻辑
在C语言中,随机数的生成主要依赖于标准库中的rand()函数。

这个函数是伪随机数生成器,其生成的随机数实际上是伪随机数,因为它们是通过确定的算法计算出来的。

C语言标准库中的rand()函数底层逻辑大致如下:
1. 初始化:在程序开始运行时,rand()函数会进行一次初始化,这个过程通常涉及到读取系统时间或其他种子值。

2. 生成伪随机数:一旦完成初始化,rand()函数就会开始生成伪随机数。

它使用一个线性同余生成器(LCG)算法来计算新的随机数。

这个算法使用一个递归公式来产生新的随机数,其中包含了前一个随机数和某个常数。

3. 返回值:每次调用rand()函数时,它会返回下一个生成的伪随机数。

需要注意的是,由于rand()函数使用的是伪随机数生成器,因此生成的随机数序列并不是真正的随机,而是具有确定的规律性。

这意味着,如果知道了当前的随机数种子和算法参数,就有可能预测下一个随机数。

因此,对于需要高度安全性的应用场景(如加密),通常不推荐使用rand()函数生成的随机数。

此外,由于rand()函数的随机性取决于种子值,因此每次程序运行时生成的随机数序列都是一样的。

如果需要每次运行程序时都得到不同的随机数序列,可以在调用rand()函数之前手动设置一个不同的种子值。

例如,可以使用time(NULL)函数获取当前时间作为种子值。

c语言rand函数原理

c语言rand函数原理

c语言rand函数原理C语言rand函数原理什么是rand函数?rand函数是C语言中的一个随机数生成函数,它用于产生一个指定范围内的伪随机数。

rand函数的使用非常广泛,在很多程序中都能见到它的身影。

rand函数的使用方法首先,需要在程序中引入头文件。

然后,可以使用rand函数来生成伪随机数。

以下是一个简单的例子:#include <>#include <>int main() {int randomNum = rand();printf("随机数:%d\n", randomNum);return 0;}rand函数生成的随机数具有以下性质:1.多次运行程序时,每次生成的随机数序列是不同的。

2.生成的随机数是均匀分布的,也就是说,每个数的出现概率相等。

rand函数的原理rand函数的原理是通过一个叫做“线性同余生成器”的算法来实现的。

这个算法的基本思路是通过一个递推式不断生成新的随机数。

1.首先,我们需要选择一个合适的初始值,称为“种子”。

一般情况下,我们可以使用系统时间作为种子,确保每次程序运行时种子都是不同的。

2.然后,使用一系列的计算公式对种子进行操作,生成新的随机数。

具体的计算公式如下:next = (a * seed + c) % m;其中,a、c、m是事先选定的常数,seed是当前的种子。

3.最后,将新生成的随机数作为下一次计算的种子,重复上述步骤。

4.当我们需要生成一个指定范围内的随机数时,可以将生成的随机数对范围进行取模运算,得到所需的结果。

尽管rand函数在日常编程中非常有用,但是它也存在一些局限性:1.生成的随机数是伪随机数,而不是真正的随机数。

这是因为生成的随机数是通过算法计算出来的,而不是基于物理过程的随机事件。

2.同一个种子生成的随机数序列是确定性的,也就是说,如果我们使用相同的种子,那么生成的随机数序列是相同的。

3.rand函数生成的随机数不是完全均匀分布的,可能会存在一定的偏差。

在VC++中生成伪随机数祥解

在VC++中生成伪随机数祥解
程序段 1 中由于将 srand() 函数放在循环体内,而程序执行的 CPU 时间较快,调用 time 函数获取的时间精度却较低(55ms),这样循环体内每次产生随机数用到的种子数都是一样 的,因此产生的随机数也是一样的。而程序段 2 中第 1 次产生的随机数要用到随机种子,以 后的每次产生随机数都是利用递推关系得到的。
在 VC++中生成伪随机数祥解
摘要 伪随机数在计算机软件设计中有很广泛的用途。本文介绍了基于数学方法的利用计算机 产生伪随机数的一种方法,即线性同余法,任何伪随机数的产生都是运用递推的原理来生成 的。以及在 Visual C++环境中产生伪随机数的两个重要函数,rand 和 srand 函数,正确地使 用这两个函数是产生性能良好的伪随机数的关键,最后介绍了利用伪随机数生成技术在 MFC 中生成基于 C/S 模式应用程序的随机校验码以及利用一种软件工具 ImagePassword 产 生随机密码。
运行结果如图 1 所示:
程序运行时,由于每一次点击"产生随机校验码"的系统时间不同,生成随机数的种子就不一 样,因此产生的随机数也是不一样的,从而保证了校验码生成的随机性。
利用 ImagePassword 工具产生随机密码 ImagePassword 提供一个可选择的图形阵列,通过随机改变图形阵列中的阵点图形来 产生随机密码。当随机点击图象阵列中的图象阵点,该阵点中的图象发生变化。其运行界面 如图 2 所示:
应用递推公式产生均匀分布随机数时,式中参数 n0,a,b,M 的选取十分重要。 例如,选取 M=10,a=b =n0=7,生成的随机序列为{6,9,0,7,6,9,……},周期为 4。 取 M=16,a=5,b =3,n0=7,生成的随机序列为{6,1,8,11,10,5,12,15,14,9, 0,3,2,13,4,7,6,1……},周期为 16。 取 M=8,a=5,b =1,n0=1,生成的随机序列为{6,7,4,5,2,3,0,1,6,7……}, 周期为 8。

用C语言产生随机数

用C语言产生随机数

用c语言产生随机数在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a)。

可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。

rand()会返回一随机数值,范围在0至RAND_MAX 间。

返回0至RAND_MAX之间的随机数值,RAND_MAX定义在,(其值至少为32767),运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。

在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。

一般用for语句来设置种子的个数。

具体见下面的例子。

一如何产生不可预见的随机序列呢利用srand((unsigned int)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的。

在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。

它们就是rand()和srand()函数。

这二个函数的工作过程如下:1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)3) 根据需要多次调用rand(),从而不间断地得到新的随机数;4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。

第二章——伪随机数的产生

第二章——伪随机数的产生
第二章 伪随机数的产生
1
第二章 伪随机数的产生
一.伪随机数产生的意义
二.产生U(0,1)的乘同余法 产生U(0,1)的乘同余法 三.正态分布N(0,1)的产生 正态分布N(0,1)的产生 四.逆变法与其它分布随机数的产生
2
一.伪随机数产生的意义(1) 伪随机数产生的意义(
1. 在GA,SA,TS中都要用到; GA,SA,TS中都要用到 中都要用到; 2. 在计算机中的固有伪随机数发生器只有 U(0,1) 且可重复性不好,没有其他分布; 且可重复性不好,没有其他分布; 3. 自己设计的发生器,可控性好、可重复性好, 自己设计的发生器,可控性好、可重复性好, 便于仿真比较。 便于仿真比较。
P{Y ≤ y} = P{F(X) ≤ y} = P{ X ≤ F−1(y)} = F( F−1 ( y) ) = y
产生 y∈U(0,1) ,F(y) U(0,1 分布函数 是 )

逆变法的目的: 逆变法的目的:产生 f (x) 分布的随机数
14
四.逆变法与其它分布随机数的产生(3) 逆变法与其它分布随机数的产生(
A= A= A=
3 5 2
xi =1,3,9,11,1,3,9,11
xi =1,5,9,13,1,5,9,13 xi=2,6,2,6…
可得整数序列 {xi } ,要想获得U(0,1),见下面 要想获得U(0,1),
6
二.产生U(0,1)的乘同余法(4) 产生U(0,1)的乘同余法
③ I. II.
产生U(0,1)步骤 产生U(0,1)步骤: 步骤:
2
= ∫ y f (y)dy − 1 2 = ∫ y dy − 1 2
0
( )
2
( )

VC随机数生成方法

VC随机数生成方法

如果仅是这样,会发现重启程序后,产生的随机数还是没有改变。这是因为每次都用 12 来初始化随机数
种子,每次产生的种子都是一样的,所以也产生相同的随机数。
为了使每次 srand 函数的参数不同,可以用 time()函数的返回值来作为 srand()的参数。
time 函数:
time_t time(time_t *t);
函数中)
void CRandTestDlg::OnButton1() {
char cTemp[8];
m_sRands="";
for (int y=0;y<5;y++) {
for (int x=0;x<10;x++) {
m_iaRands[x][y]=rand();
memset(cTemp,0,sizeof(cTemp)); //初始化数组
钮产生的随机数和上次启动程序后产生的随机数。这就是我们叫这个函数产生的是伪随机数的原因。因
为初始化这个随机数发生器的种子是在编译的时候就确定的,所以每次启动程序参数的随机数都相同。
srand 函数
void srand(unsigned int seed);
srand 函数是用来初始化随机数发生器种子的,这个函数在程序中单独使用没有意义,必须和 rand()配
合使用。此函数有一个 unsigned int 的参数,就是用这个参数来生成一个随机数种子。见如下示例代码
void CRandTestDlg::OnButton2()
{
char
cTemp[8]={'\0'};
if (!m_bFlag){
//用一个 bool 变量来保证只初始化一次

c语言如何产生随机数

c语言如何产生随机数

C语言如何产生随机数1. 基本函数int rand(void);void srand (unsigned int n);#include <stdlib.h>2. 使用方法rand()函数返回0到RAND_MAX之间的伪随机数(pseudorandom)。

RAND_MAX常量被定义在stdlib.h头文件中。

其值等于32767,或者更大。

srand()函数使用自变量n作为种子,用来初始化随机数产生器。

只要把相同的种子传入srand(),然后调用rand()时,就会产生相同的随机数序列。

因此,我们可以把时间作为srand()函数的种子,就可以避免重复的发生。

如果,调用rand()之前没有先调用srand(),就和事先调用srand(1)所产生的结果一样。

for (int i=0; i<10; i++){printf("%d ", rand()%10);}每次运行都将输出:1 7 4 0 9 4 8 8 2 4srand(1);for (int i=0; i<10; i++){printf("%d ", rand()%10);}每次运行都将输出:1 7 4 0 9 4 8 8 2 4例2的输出结果与例1是完全一样的。

srand(8);for (int i=0; i<10; i++){printf("%d ", rand()%10);}每次运行都将输出:4 0 1 3 5 3 7 7 1 5该程序取得的随机值也是在[0,10)之间,与srand(1)所取得的值不同,但是每次运行程序的结果都相同。

srand((unsigned)time(NULL));for (int i=0; i<10; i++){printf("%d ", rand()%10);}该程序每次运行结果都不一样,因为每次启动程序的时间都不同。

C语言中产生随机数的方法

C语言中产生随机数的方法

C语言中产生随机数的方法1. 使用rand(函数:C语言中的rand(函数是一个伪随机数生成函数,它可以产生一个0到RAND_MAX之间的随机整数。

要使用rand(函数,我们需要包含<stdlib.h>头文件,并调用srand(函数来初始化随机数种子。

以下是使用rand(函数生成随机数的示例代码:#include <stdio.h>#include <stdlib.h>int maiint i;for (i = 0; i < 10; i++)printf("%d\n", rand();}return 0;上述代码使用循环生成10个随机数,并使用printf(函数打印出来。

注意,每次运行程序时生成的随机数都是不同的,因为随机数种子是根据当前时间生成的。

2. 使用srand(函数:srand(函数用于设置rand(函数的随机数种子。

我们通常将时间作为种子来产生不同的随机数序列。

以下是使用srand(函数产生随机数的示例代码:#include <stdio.h>#include <stdlib.h>int maiint i;for (i = 0; i < 10; i++)printf("%d\n", rand( % 10); // 生成0到9之间的随机数}return 0;上述代码生成了10个0到9之间的随机数,并使用printf(函数打印出来。

我们使用rand(函数与模运算来产生特定范围内的随机数。

#include <stdio.h>#include <stdlib.h>int maiint i, num;for (i = 0; i < 10; i++)num = rand( % 100 + 1; // 生成1到100之间的随机数printf("%d\n", num);sleep(1); // 暂停1秒钟}return 0;上述代码生成了10个1到100之间的随机数,并使用printf(函数打印出来。

第2章 伪随机数的产生

第2章 伪随机数的产生
9-5
二、乘同余法产生0-1均匀 乘同余法产生 均匀 分布的伪随机数
例子: 例子:L=6,M=64,A=13,S0=1,可计算得 , 之间非重复长度达到2 到1~M之间非重复长度达到 4=16的均 之间非重复长度达到 的均 匀分布伪随机序列。 匀分布伪随机序列。 {1,13,41,21,17,29,57,37,33,45,9,53,49,61 ,25,5,1}
9-14
五、C#中随机数的产生 中随机数的产生
实例2 实例2: 产生一个随机数组 int[] int[10]; int[] arr = new int[10]; int i; //初始化数组 //初始化数组 for (i = 0; i < 10; i++) {arr[i] = i;} //随机数 //随机数 Random(); Random ra = new Random(); j---) for (int j = 9; j >=0; j--) { int address = ra.Next(j); int tmp = arr[address]; arr[address] = arr[j]; arr[j] = tmp; }
9-6
二、乘同余法产生0-1均匀 乘同余法产生 均匀 分布的伪随机数
4. 混合同余法 可产生比上述方法更长的服从均匀分布的 随机数序列。 随机数序列。 Sk+1=(ASk+C) mod (M) ( ) 数论理论可证明:对于模数M=2L,当 数论理论可证明:对于模数 A=4k+1(k为正整数)且C、M互质时,可 为正整数) 互质时, ( 为正整数 、 互质时 以获得最长随机数序列长度为2 以获得最长随机数序列长度为 L。
9-11
四、产生其他内部随机数的 逆变法
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4.3.1伪随机数的产生
产生伪随机数的函数是rand(),该函数可随机生成0~RAND_MAX之间的一个整数。

RAND_MAX是头文件<stdlib.h>中定义的一个符号常量。

ANSI规定RAND_MAX的值不小于32767。

在编写程序时经常需要各种范围的随机数,如投骰子时需要的随机数是1~6,投一枚硬币会有正反面,需要的随机数是0~1。

根据公式:
n=a+rand()%b
可以得到所需范围内的随机数。

其中,a为位移,是所需连续整数范围的第一个数,b是比例因子,是所需连续整数范围的宽度,则希望产生1~6之间随机数的公式为:face=1+rand()%6
【例4-3】编写一个模拟投掷硬币的程序,模拟20次,统计出正面出现的次数。

问题分析:每调用一次rand()函数会产生一个随机数,循环20次可以产生20个随机数。

硬币有正反两面,用1代表正面,0代表反面,产生伪随机数的公式为rand()%2。

参考程序如下:
/*程序名:4_3.c*/
/*功能:模拟投掷硬币20次,打印投掷结果并统计出正面出现的次数*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,face,iCount=0;
for(i=1;i<=20;i++)
{
face=rand()%2;
printf("%5d",face);
if(i%10==0)printf("\n");
if(face)iCount++;
}
printf("正面出现次数:%d次\n",iCount);
return0;
}
运行程序,结果为:
1100100000
1111111010
正面出现次数:11次
如果再次运行该程序,会发现结果与上面的相同。

这怎么称得上是随机数呢?实际上,每次调用rand函数产生的一系列数似乎是随机的,但每次执行程序所产生的序列则是重复的。

程序调试完成后,可以使用函数srand(),通过提供不同的种子产生不同的随机数序列。

相关文档
最新文档