rand()函数可以产生[0,RAND_MAX]之间的均匀的伪随机数,它定义在头文件stdlib.h中,函数原型:

int rand(void);

C标准库的实现是:

unsigned long int next = ;

/*rand: return pseudo-number integer on 0...32767*/
int rand(void)
{
next = next* + ;
return (unsigned int)(next/) % ;
} /*srand: set seed for rand()*/
void srand(unsigned int seed)
{
next = seed;
}

如果没有初始化“随机数种子”,那么默认初始种子是1,1*1103515245+12345,return得到第一个伪随机数,接着将这个结果作为下次的种子,带入式子得到第二个伪随机数……

之所以定义为unsigned int,是防止数值溢出后不会出现负值。

直接调用rand(),会导致产生的是同一套随机数,所以我们使用srand()来初始化随机数种子。

要注意的是:不同编译器计算随机数的方法不尽相同,所以即使给srand()传递相同的参数,也可能产生不同的随机数序列。

举个栗子:

/*产生0-9的随机数*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h> int main(int argc,char** argv)
{
srand(time(NULL)); //初始化随机数种子
for(int i = ;i < ;i++)
{
printf("%d ",rand()%);
} return ;
}

利用rand()%n产生[0,n)之间的随机数,那么一旦n > RAND_MAX,这种做法就会失效。

如果你对精度的要求不高,可以采用如下办法:
先用rand()/RAND_MAX,得到[0,1]之间的随机实数,然后扩大n-1倍,四舍五入,就可得到[0,n-1]之间的随机数。

/*产生10个[0,99999]之间的随机数*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h> int main(int argc,char** argv)
{
int n = ;
double random_doub;
int random_num; srand(time(NULL)); //初始化随机数种子 for(int i = ;i < ;i++)
{
random_doub = (double)rand() / RAND_MAX; //生成[0,1]之间的随机数
random_num = (int)((n - )*random_doub + 0.5); //生成[0,n-1]之间的随机数
printf("%d ",random_num);
} return ;
}

Random Number Generator的更多相关文章

  1. 文献翻译|Design of True Random Number Generator Based on Multi-stage Feedback Ring Oscillator(基于多级反馈环形振荡器的真随机数发生器设计)

    基于多级反馈环形振荡器的真随机数发生器设计 摘要 真随机数生成器(trng)在加密系统中起着重要的作用.本文提出了一种在现场可编程门阵列(FPGA)上生成真随机数的新方法,该方法以 多级反馈环形振荡器 ...

  2. 【Codechef】Random Number Generator(多项式除法)

    题解 前置技能 1.多项式求逆 求\(f(x)\*g(x) \equiv 1 \pmod {x^{t}}\) 我们在t == 1时,有\(f[0] = frac{1}{g[0]}\) 之后呢,我们倍增 ...

  3. @codechef - RNG@ Random Number Generator

    目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @accepted code@ @details@ @description@ ...

  4. [spojRNG]Random Number Generator

    先将所有数加上Ri,即变为区间[0,2Ri],考虑容斥,将区间容斥为[0,+oo)-[2Ri,+oo),然后对[2Ri,+oo)令$bi=ai-2Ri$,相当于范围都是[0,+oo)问题转化为求n个正 ...

  5. Random number

    Original #include <stdlib.h> #include <time.h> srand(time(NULL)); rand(); The versions o ...

  6. Case Study: Random Number Generation(翻译教材)

    很荣幸,经过三天的努力.终于把自己翻译的教材做完了,现在把它贴出来,希望能指出其中的不足.   Case Study: Random Number Generation Fig. 6.7  C++ 标 ...

  7. ISO C Random Number Functions

    This section describes the random number functions that are part of the ISO C standard. To use these ...

  8. How to generate a random number in R

    Generate a random number between 5.0 and 7.5x1 <- runif(1, 5.0, 7.5) # 参数1表示产生一个随机数x2 <- runif ...

  9. Linux shell get random number

    the Shell Profile: When a new interactive shell is started, /etc/profile, followed by /etc/bash.bash ...

随机推荐

  1. Git常用命令(一)

    $ git init 初始化仓库(会生成一个隐藏文件.git) $ git add + (文件名) 实现对指定文件的跟踪 $ git commit 提交更新$ git clone + URL 克隆远程 ...

  2. 谁给你说的 Ubuntu 不可以输入中文

    文章更新于:2020-04-04 按照惯例,需要的文件附上链接放在文首 文件名:sogoupinyin_2.3.1.0112_amd64.deb 文件大小:25.5 MB 下载链接:https://w ...

  3. java文件中字母出现的次数和百分比

    主要是文件的读写.先在代码中导入文件.一行一行的进行数据的读入,通过“  ”空格对读入的信息进行分割,存入到数组里之后对于每一个单词的每一个字母进行区分存入相应的字母数组里.最后统计总的字母个数.应用 ...

  4. Java并发编程实战 01并发编程的Bug源头

    摘要 编写正确的并发程序对我来说是一件极其困难的事情,由于知识不足,只知道synchronized这个修饰符进行同步. 本文为学习极客时间:Java并发编程实战 01的总结,文章取图也是来自于该文章 ...

  5. MTK Android Git提取出两个版本之间的差异文件并打包

    git提取出两个版本之间的差异文件并打包 首先你得知道版本之间的commit id git log –pretty=oneline $ git log --pretty=oneline 1 差异文件并 ...

  6. 接口自动化测试之-requests模块详解

    一.requests背景 Requests 继承了urllib2的所有特性.Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国 ...

  7. Erlang语言之简述及安装

    1. 简述 Erlang在1991年由爱立信公司向用户推出了第一个版本,经过不断的改进完善和发展,在1996年爱立信又为所有的Erlang用户提供了一个非常实用且稳定的OTP软件库并在1998年发布了 ...

  8. 【翻译】创建String 使用“”还是构造函数(new String)

    在java中创建String,通常有以下两种方法. String x = "abc"; String y = new String("abc"); 它们之间有什 ...

  9. Map使用foreach遍历方式,Map获取第一个键值

    List<Map<String, Object>> mapList = new ArrayList<>();  for (Map.Entry<String,O ...

  10. matlab创建HDF5文件

    一.例子 1.创建写入 testdata = uint8(magic(5)); h5create('my_example.h5','/dataset1',size(testdata)); %创建 h5 ...