C++取a到b之间的随机数

本文详细介绍了计算机中伪随机数的生成原理及方法,包括rand()和srand()函数的使用,如何通过设置随机种子来生成不同的随机数序列,并提供了产生指定范围内随机数的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意:小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。) 
 
我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统。
 
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()初始化它。
 
2.srand()
功能:初始化随机数发生器
 
用法: void srand(unsigned int seed)
 
所在头文件: stdlib.h
 
srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
 
3.使用当前时钟作为随机数种子
rand()产生的随机数在每次运行的时候都是与上一次相同的。若要不同,用函数srand()初始化它。可以利用srand((unsigned int)(time(NULL))的方法,产生不同的随机数种子,因为每一次运行程序的时间是不同的。
 
4.产生随机数的用法
1) 给srand()提供一个种子,它是一个unsigned int类型;
2) 调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到RAND_MAX之间);
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
 
0~RAND_MAX之间的随机数程序
#include  
#include  
#include  

using namespace std; 

int main() 

        srand((unsigned)time(NULL)); 
        for(int i = 0; i < 10;i++ ) 
                cout << rand() << '\t'; 
        cout << endl; 
        return 0; 
}
 
5.产生一定范围随机数的通用表示公式
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
 
  1. #include <</SPAN>cstdlib>  
  2. #include <</SPAN>iostream>  
  3. #include<</SPAN>stdlib.h>  
  4. using namespace std;  
  5.   
  6. int myRand(int a,int b){  
  7.       
  8.     return (a>=b)?0:(a+rand()%(b-a));  
  9.  
  10.   
  11.   
  12. int main(int argc, char *argv[])  
  13.  
  14.     for(int i=0;i<</SPAN>10;i++){  
  15.         int cmyRand(1,100);  
  16.         cout<</SPAN><</SPAN>"c="<</SPAN><</SPAN>c<</SPAN><</SPAN>endl 
  17.      
  18.     system("PAUSE");  
  19.     return EXIT_SUCCESS;  
  20.  
  21.   

 

产生a~b之间随机数(含a,b):a+rand()%(b-a),的确不明白,不是a+rand()*(b-a)吗?????



FROM: http://blog.sina.com.cn/s/blog_6cc7141501016ib1.html

<think>好的,我现在需要帮助用户解决如何在编程中生成指定区间[a, b]内的随机数的问题。首先,我得回忆一下不同编程语言中生成随机数的方法,然后根据用户提供的引用内容来整理答案。 用户提到了几个引用,包括C语言、bat脚本、Python、VBA和C++的例子。看来需要覆盖多种语言的方法。不过用户的问题没有明确指定语言,所以可能需要给出通用的方法,再分语言具体说明。 首先,通用思路应该是这样的:大多数编程语言的随机数函数生成的是0到1或者固定范围的整数,比如C的rand()返回0到RAND_MAX。所以要将这个范围映射到用户想要的[a, b]区间。数学公式应该是这样的:随机数 = a + (b - a) * rand() / (最大值)。如果是整数的话,可能需要整,比如使用floor或者四舍五入,或者直接整数运算。 接下来,根据每个引用整理具体语言的实现: 引用1和5是关于C/C++的,使用srand和rand,然后通过模运算和调整得到区间内的数。比如,C语言中生成[a, b]的整数可以用rand() % (b - a + 1) + a。不过要注意初始种子用srand(time(NULL))来保证每次不同。 引用2提到bat脚本,用%random%生成0到32767的数,然后通过模运算调整到指定范围。例如,生成1到100的随机数可以用set /a num=%random% %% 100 +1。 引用3是Python的,使用random模块的randint和uniform函数。randint(a, b)直接生成整数,uniform(a, b)生成浮点数。 引用4是VBA的,使用Rnd函数生成0到1之间的数,然后通过公式调整,比如Int((1000 - 1 + 1) * Rnd + 1)得到1到1000的整数。 需要把这些方法整理出来,分语言说明步骤,并给出示例代码。同时要注意用户提到的LaTeX格式要求,行内公式用$...$,独立公式用$$...$$,比如数学公式可能需要写成:$$x = a + (b - a) \times \text{rand()}/(\text{最大值})$$ 然后,检查每个步骤是否符合用户的要求,比如是否需要说明种子设置,是否需要处理浮点和整数的情况,是否有常见错误需要注意,比如C语言中使用模运算可能导致的分布不均问题(如果范围不是32767的约数的话),这时候可能需要使用其他方法如:((double)rand() / RAND_MAX) * (b - a) + a,然后整。 还需要考虑用户可能的后续问题,比如如何生成不重复的随机数,或者如何优化性能,但当前问题只需要生成方法。 最后,生成相关问题,比如如何确保随机性,不同语言的差异,或者处理种子的问题等。 现在组织回答结构:先总述方法,再分语言详细说明,附代码示例,然后注意事项,最后相关问题。</think>在编程中生成指定区间$[a, b]$内的随机数,核心思路是将标准随机数生成器的输出范围映射到目标区间。以下是不同语言的实现方法及示例代码: --- ### 一、通用数学公式 1. **整数随机数**: $$x = a + \text{rand()} \ \% \ (b - a + 1)$$ 其中`rand()`生成$[0, N)$的整数,`%`为模运算[^2][^5]。 2. **浮点数随机数**: $$x = a + (b - a) \times \frac{\text{rand()}}{\text{MAX_RAND}}$$ 其中`MAX_RAND`是随机数生成器的最大值(如C语言中为`RAND_MAX`)[^1][^3][^4]。 --- ### 二、具体语言实现 #### 1. C/C++ 生成$[a, b]$的**整数**: ```c #include <stdlib.h> #include <time.h> srand((unsigned int)time(NULL)); // 初始化随机种子[^1] int random_num = rand() % (b - a + 1) + a; ``` 生成$[a, b)$的**浮点数**: ```c double random_float = a + (double)rand() / RAND_MAX * (b - a); ``` #### 2. Python 生成$[a, b]$的**整数**: ```python import random random_int = random.randint(a, b) # 包含a和b ``` 生成$[a, b)$的**浮点数**: ```python random_float = random.uniform(a, b) # 包含a但不一定包含b ``` #### 3. VBA 生成$[a, b]$的**整数**: ```vba Randomize ' 初始化随机种子[^4] random_num = Int((b - a + 1) * Rnd + a) ``` #### 4. Batch脚本 生成$[a, b]$的**整数**: ```batch set /a random_num=%random% %% (b - a + 1) + a # %random%范围0~32767[^2] ``` --- ### 三、注意事项 1. **种子初始化**:C/C++、VBA等需通过`srand()`或`Randomize`设置种子,避免重复生成相同序列[^1]。 2. **浮点数精度**:部分语言(如Python的`uniform()`)可能不严格包含区间端点。 3. **均匀分布问题**:直接模可能导致分布不均,建议优先使用语言内置函数(如Python的`randint`)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值