C语言 获取随机数 gaunthan Posted on Feb 13 2017 ? C Language ? >本文讲述了在C语言中如何获取随机数。 ## rand() `rand()`函数可以用来产生伪随机数,它根据一个基准(种子)以某个递推公式推算出随机数。当使用rand()产生的一系列数符合正态公布时,就相当于产生了随机数。计算机正常开机后,种子的值是默认固定的,为1。 /* @brief 随机数发生器 * @return 返回一个伪随机数 * @header stdlib.h */ int rand(void) `rand()`返回随机数值的范围在`0`至`MAX_INT`(定义在limits.h)间。每一个数被选择的概率是相同的。 ## srand() `rand()`产生的是伪随机数字,程序每次执行时产生的序列是相同的。若要每一次运行程序都产生不同的序列,则需用函数`srand()`初始化随机数种子。 /* @brief 初始化随机数发生器 * @param 种子 * @header stdlib.h */ void srand(unsigned int seed) `srand()`用来设置`rand()`产生随机数时的随机数种子。参数seed必须是个整数,如果每次seed都设相同值,`rand()`所产生的随机数序列每次就会一样。 ### 选择随机数种子 #### 使用当前时钟作为种子 可以利用`srand((unsigned int)(time(NULL))`的方法,使用当前时钟作为种子传递给`srand()`。 ## 产生随机数的用法 1. 给srand()提供一个种子; 2. 调用rand(),返回一个随机数(在0到MAX_INT之间); 3. 根据需要多次调用rand(),从而不间断地得到新的随机数; 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。 ## 产生一定范围的随机数 |随机数区间|生成表达式| |--| |[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是整数的范围。 ## 生成[0, n-1]之间的k个不同随机数 怎么快速生成[0, n-1]之间的k个不同的随机顺序的随机整数?按照直觉,我们会通过不停地调用`rand() % n`来生成新的随机数,直到生成够k个为止来达成目的,这期间还用到了某种容器和搜索算法。然而,这种思路导出的代码复杂又低效。 实际上,有一个优美的实现可以达到要求: ```c /* 生成[0, n-1]之间的k个不同随机数 */ void foo(int* a, int n, int k) { int i; for(i = 0; i < n; ++i) a[i] = i; for(i = 0; i < k; ++i) swap(&a[i], &a[randint(i, n-1)]); } ``` 其中,`swap(int*, int*)`交换两个`int*`指针指向的内存单元的值,`randint(min, max)`生成[min, max]之间的随机数。 赏 Wechat Pay Alipay [Reprinting] C++ Web Programming do … while(0) 的妙用