文档章节

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

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

zhywxyy
08/21
0
0
SylixOS Python扩展库开发

1 适用范围 本文档适用于希望使用基于SylixOS进行Python扩展库开发的用户。 2 SylixOS Python简介 Python是一门面向对象的解释型的脚本语言,Python具有丰富和强大的库。它常被昵称为胶水语言...

zhaotongch
09/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用JavaScript ES6的新特性计算Fibonacci(非波拉契数列)

程序员面试系列 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Java Marker Interface(标记接口) 使...

JerryWang_SAP
25分钟前
2
0
docker安装redis、mongodb、mysql等

一、启动docker服务,设置镜像: systemctl start dockervi /etc/docker/daemon.json{ "registry-mirrors": ["https://registry.docker-cn.com"]} 二、下拉镜像: 在镜像中心h...

狼王黄师傅
49分钟前
1
0
deepin系统使用deepin-wine安装exe程序

deepin自带原生deepin-wine使用命令如下: deepin-wine QQBrowser.exedeepin-wine QQMusicSetup.exe 默认安装的快捷方式位置: /root/.wine/drive_c/'Program Files'/Tencent/QQBrowser/......

临江仙卜算子
今天
4
0
快速get到学习Linux操作系统的点

快速get到学习Linux操作系统的点 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux能够运行主要的UNIX工具软件...

linuxCool
今天
3
0
聊聊:Linux分区的那些方案

安装linux的整体步骤其实比较简单,唯一可能值得说明的地方,大概就是linux的分区了。 下面来给大家推荐一些分区方案。 1 分两个区 实际上,很多时候我们只需要分两个区:`/`和交换分区,日常...

Linux就该这么学
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部