文档章节

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
博文 16
码字总数 16533
作品 0
南京
私信 提问
SylixOS-IgH系统平台搭建

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

zhengleich
2018/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
VxWorks驱动移植至SylixOS总结

本文档描述了将VxWorks中的驱动源码快速移植至SylixOS中的方法,使用时需要结合SylixOS中的VxWorks兼容层实现。 1. 驱动注册与初始化 1.1 VxWorks中驱动注册与初始化 1.1.1 初始化函数 VxWo...

zhywxyy
2018/08/21
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
2018/06/26
0
0
SylixOS调试方法详解——综合案例分析

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

Esc120
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Batch @SpringBatchTest 注解

Spring Batch 提供了一些非常有用的工具类(例如 JobLauncherTestUtils 和 JobRepositoryTestUtils)和测试执行监听器(StepScopeTestExecutionListener 和 JobScopeTestExecutionListener)......

honeymose
16分钟前
2
0
浏览器缓存

HTTP缓存类型 200 from cache:直接从本地缓存获取响应,可细分为from disk cache, from memory cache 304 Not Modified:协商缓存,本地未命中发送校验数据到服务端,如果服务端数据没有改变,则读...

关元
29分钟前
2
0
正则表达式简单使用说明

在Python3里确实简单明了,测试样例如下 # 正则content = 'Hello 1234567 World_This is a Regex Demo'# 贪婪匹配 尽可能多的匹配result = re.match('^He.*(\d+).*Demo$', co......

轻轻的往前走
31分钟前
2
0
多线程创建方式

一、基本概念 进程:就是正在运行的应用程序,进程是线程的集合。 线程:就是进程中的一条执行路径,一个独立的执行单元。 多线程:就是为了提高程序的效率,使用多线程,每个线程互不影响,...

秋至丶枫以落
34分钟前
1
0
聊聊flink的Async I/O

序 本文主要研究一下flink的Async I/O 实例 // This example implements the asynchronous request and callback with Futures that have the// interface of Java 8's futures (which is t......

go4it
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部