文档章节

SylixOS下获取随机数

渀波儿灞
 渀波儿灞
发布于 2017/08/28 20:55
字数 1291
阅读 7
收藏 0

1. 概述

        随机数是专门的随机试验的结果,数学上产生的随机数被称为“伪随机数”,真正的随机数是由物理方法产生的。随机数的产生是由算术规则产生,由于随机数种子的不同,最终生成的随机数也不相同。如果随机数种子相同,则生成的随机数也是相同的,因此要产生随机数,随机数种子必须是随机的。

       在编程过程中,有的时候需要通过代码生成随机数,SylixOS提供了生成随机数的函数以及随机数设备。

2. 函数介绍

        SylixOS提供获取随机数种子函数srand,以及rand函数产生随机数。

        srand函数用于设置随机数种子,函数如下:

#include <SylixOS.h>
VOID    srand (uint_t  uiSeed);

        srand函数原型分析:

  •     参数uiSeed表示随机数种子,通常产生的随机数种子是随机的。

        rand函数用于产生随机数,产生的随机数在“0 ~ RAND_MAX”之间,SylixOS当前定义RAND_MAX值为2147483647,函数如下:

#include <SylixOS.h>
INT     rand(VOID);

        rand函数原型分析:

  •     函数根据随机数种子生产随机数。

3. 获取随机数

        随机数的产生与随机数种子相关,通常获取随机数可以通过当前时间获取和读取随机数设备获取。

3.1 通过系统时间获取随机数

        通过time函数获取当前的系统时间,通过当前的系统时间生产随机数种子。由于系统时间是在不断的变化,因此保证了每次的随机种子是不相同的。

        示例代码如程序清单 3‑1所示。

程序清单 3-1 通过系统时间获取随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (int argc, char **argv)
{
    int     i = 0;

    srand((unsigned int)time(NULL));             	/* 生成随机数种子     		*/

    for (i = 0; i < 10; i++) {
        printf("%d\n", rand() % 100 +1);         	/* 生成1-100之间的随机数 	*/
    }

    return  (0);
}

        运行程序清单 3‑1所示代码,结果如下:

[root@sylixos:/root]# /apps/test_rand/test_rand
random : 65
random : 26
random : 84
random : 56
random : 56
random : 92
random : 82
random : 35
random : 83
random : 36
[root@sylixos:/root]# /apps/test_rand/test_rand
random : 89
random : 81
random : 90
random : 20
random : 16
random : 51
random : 23
random : 47
random : 94
random : 5

        运行程序2次,由结果可知两次的运行结果是不一样的。

3.2 随机数设备获取随机数

        计算机本身是可预测的系统,因此用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。

        SylixOS内核实现的随机数发生器正是利用系统中的这些随机噪声来产生高质量随机数序列。SylixOS中的随机数可以从两个特殊的文件中产生,一个是“/dev/urandom”,另一个是“/dev/random”。它们产生随机数的原理是利用当前系统的熵池来计算出固定数量的随机比特,然后将这些比特作为字节流返回。

        熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用、文件的使用量、不同类型的进程数量等。如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,而当前需要大量的随机比特,这时产生的随机数的随机效果相对较差。

        “/dev/urandom”文件和“/dev/random”文件不同之处在于后者在不能产生新的随机数时会阻塞程序,而前者不会(ublock),但是产生的随机数效果相对不是很好,这对加密解密这样的应用来说就不是一种很好的选择。

        SylixOS提供“/dev/urandom”和“/dev/random”两种随机设备,如图 3‑1所示。

图 3-1 随机数设备

        利用该设备获取随机数,示例代码如程序清单 3‑2所示。

   程序清单 3-2 通过随机数设备获取随机数

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int 			iFd;
    unsigned int		uiSeed;

    iFd = open("/dev/urandom", O_RDWR);            	/*  打开随机数设备文件  	*/
    if (iFd < 0) {
        sprintf(stderr, "open error\n");
        close(iFd);
        return(-1);
    }
    if (read(iFd, &uiSeed, sizeof(uiSeed)) < 0) {	/*  读取随机数设备     		*/
        sprintf(stderr, "read error\n");
        close(iFd);
        return (-1);
    }

    srand(uiSeed);                  			    /*  获取随机数种子          */
    printf("random : %d\n", rand());			    /*  获取随机数              */

    close(iFd);
    return (0);
}

        运行程序清单 3‑2所示代码,运行结果如下:

[root@sylixos:/root]# /apps/test_rand/test_rand
random : 993515266
[root@sylixos:/root]# /apps/test_rand/test_rand
random : 221898156
[root@sylixos:/root]# /apps/test_rand/test_rand
random : 1087964684
[root@sylixos:/root]# /apps/test_rand/test_rand
random : 816671734
[root@sylixos:/root]# /apps/test_rand/test_rand
random : 2027404039
[root@sylixos:/root]# /apps/test_rand/test_rand

        运行示例程序5次,由运行结果可知每次产生的随机数是不同的。

4. 参考资料

        《SylixOS应用程序开发手册》

 

© 著作权归作者所有

共有 人打赏支持
渀波儿灞
粉丝 2
博文 15
码字总数 15941
作品 0
南京
SylixOS-IgH系统平台搭建

1.参考手册 下面7个文件存放在本地服务器“\10.9.1.113.研发部9.ExchangeFolder郑磊”路径下 《RealEvo-IDE使用手册》 《SylixOS应用开发手册》 《SylixOSshell用户手册》 《SylixOS-IgH使用...

zhengleich
05/15
0
0
SylixOS上EtherCAT实现

1 EtherCAT开源协议栈介绍 目前常见开源的主站代码为RT-LAB开发的SOEM(Simple OpenSource EtherCAT Master)和EtherLab的the IgH EtherCAT® Master,SylixOS对两者都支持。其中IgH作为常用的...

Jackstraw瑞
2017/11/01
0
0
SylixOS线程堆栈大小浅析

目录 1. SylixOS线程、线程栈介绍 1 1.1 线程的介绍 1 1.2 线程栈的介绍 1 2. SylixOS线程栈大小的分配 1 2.1 线程、线程栈相关属性的设置 2 2.2 线程栈大小 2 2.3 线程堆栈警戒区 3 3. 总结...

Esc120
06/26
0
0
SylixOS调试方法详解——综合案例分析

1. SylixOS调试方法介绍 SylixOS实现了一个功能强大的调试stub(桩),可在设备或模拟器上在线调试应用程序,RealEvo-IDE也提供配套的调试插件。目前RealEvo-IDE既支持自动推送调试、也支持传...

Esc120
06/26
0
0
SylixOS调试方法详解——综合案例分析

SylixOS调试方法介绍 SylixOS实现了一个功能强大的调试stub(桩),可在设备或模拟器上在线调试应用程序,RealEvo-IDE也提供配套的调试插件。目前RealEvo-IDE既支持自动推送调试、也支持传统...

Esc130
2017/10/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python标准输入输出

input() 读取键盘输入 input() 函数从标准输入读入一行文本,默认的标准输入是键盘。 input 可以接收一个Python表达式作为输入,并将运算结果返回。 print()和format()输出 format()输出...

colinux
20分钟前
0
0
Python 核心编程 (全)

浅拷贝和深拷贝 1.浅拷贝:是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。相当于把变量里面指向的一个地址给了另一个变量就是浅拷贝,而没有创建一个新的对象,如a...

代码打碟手
32分钟前
0
0
PHP 对象比数组省内存?错!数组比对象省内存?错!

刚刚一个群里有人引出了 PHP 数组和对象占用内存谁多谁少的问题。我想起之前我好像也测试过这个问题,和群里人说的对象比数组节省内存的结论相反,我得出的是数组比对象节省内存。 但今天,我...

宇润
49分钟前
1
0
memcached命令行及其用法

21.5 memcached命令行 创建数据 yum install -y telnet 利用telnet命令连接memcached数据库 telnet 127.0.0.1 11211 #写入数据 set key2 0 30 212STORED 这个是错误的示范,因为0 30 已经...

lyy549745
49分钟前
0
0
Maven私服

Maven私服 一、简介 当多人项目开发的时候,尤其聚合项目开发,项目和项目之间需要有依赖关系,通过maven私服,可以保存互相依赖的jar包,这样的话就可把多个项目整合到一起。 如下图: Inst...

星汉
52分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部