关于程序员:产生一个随机数伪随机的一种方法c语言

46次阅读

共计 1695 个字符,预计需要花费 5 分钟才能阅读完成。

基本原理

应用计算机产生伪随机数的最简略办法办法:基于工夫戳及 rand 等函数产生的伪随机数。对于这种办法,咱们只须要领有工夫戳这个参数即可实现。
注:计算机并不能产生真正的随机数,而是将曾经编写好的一些无规则排列的数字存储在电脑里,把这些数字划分为若干相等的 N 份,并为每份加上一个编号,用 srand()函数获取这个编号,而后 rand()就按程序获取这些数字,当 srand()的参数值固定的时候,rand()取得的数也是固定的,所以个别 srand 的参数用 time(NULL),因为零碎的工夫始终在变,所以 rand()取得的数,也就始终在变,相当于是随机数了。只有用户或第三方不设置随机种子,那么在默认状况下随机种子来自零碎时钟。如果想在一个程序中生成随机数序列,须要至少在生成随机数之前设置一次随机种子。

相干常识
  • 工夫戳:

这里的工夫戳是为简略的概念,是以后计算机工夫与 1970 年一月一日零时零分零秒的差值再换算成单位为秒的一串数字。

  • 随机种子:

是计算机专业术语,一种以随机数作为对象的以真随机数(种子)为初始条件的随机数。个别计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,而后用肯定的算法不停迭代产生随机数。
注:本文利用 srand 设置随机种子。

  • rand 函数:

简略了解是一个无需参数就可能产生 0 到 32767 之间的随机数且返回值为 int 类型的函数。
函数原型:int rand (void)
rand 函数每次调用前都会查问是否调用过 srand(seed),是否给 seed 设定了一个值,如果有,那么它会主动调用 srand(seed)一次来初始化它的起始值,若之前没有调用 srand(seed),那么零碎会主动给 seed 赋初始值。

  • srand 函数:

简略了解是为 rand 函数设置一个随机终点。
函数原型:void srand (unsigned int seed)
是利用 time 函数来基于工夫戳(工夫与 1970 年一月一日 0 时 0 分 0 秒的差值以秒为单位)去设置随机数的生成终点,只调用一次就好(处于主函数即可),反复调用(位于自定义函数不现实)可能会与刚刚产生的随机数相近。

  • time 函数:

简略了解为返回以后计算机工夫
函数原型: time_t time(time_t *timer)
参数阐明: timer=NULL 时失去以后日历工夫(从 1970-01-01 00:00:00 到当初的秒数),timer= 工夫数值时,用于设置日历工夫,time_t 是一个 unsigned long 类型。如果 timer 不为空,则返回值也存储在变量 timer 中。
函数性能: 失去以后日历工夫或者设置日历工夫
函数返回: 以后日历工夫
是对 typedef 的重新命名,实质上为长整型 返回整形指针

  • NULL:

简略了解为返回空指针。
用于批示指针不援用无效对象。程序通常应用空指针来示意条件,被定义为 ((void*)0), 0 或 0L,这取决于编译器类型。

  • unsigned int:

简略了解为强制类型转化为 int 类型的类型操作符
要应用的话,则尽量避免有符号数与无符号数的比拟运算和防止减法运算,在很多时候,在 unsigned 的世界里,x-y>0 与 x >y 都是不等价的。

  • 相干头文件:<stdlib.h>、<time.h>
具体操作

打印 10 个随机数

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int main()
{
    int a;
    int b;
    srand((unsigned int)time(NULL));
    for (a = 1; a <= 10; a++)
    {b = rand();
        printf("%d", b);
    };
    return 0;
}

若要求打印 100 以内随机数,则利用取模运算即可。

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int main()
{
    int a;
    int b;
    srand((unsigned int)time(NULL));
    for (a = 1; a <= 10; a++)
    {b = rand()%100;
        printf("%d", b);
    };
    return 0;
}

后注

自己为初学者,所写可能存在错漏,如有发现,欢送批评指正!

正文完
 0