文档章节

SylixOS下获取随机数

渀波儿灞
 渀波儿灞
发布于 2017/08/28 20:55
字数 1291
阅读 32
收藏 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
南京
私信 提问
加载中
请先登录后再评论。
C++科学计算库--O2scl

一个面向对象的 C++科学计算库,可用于解方程,最小化,微分,积分,插值,优化,逼近,分析,拟合等。许多类可操作于通用的函数和向量类型。可用于O2scl在Linux,Mac和Windows(Cygwin的)平...

匿名
2012/10/29
4.7K
0
全站 HTTPS 来了

各位使用百度、谷歌或淘宝的时候,有没有注意浏览器左上角已经全部出现了一把绿色锁,这把锁表明该网站已经使用了 HTTPS 进行保护。仔细观察,会发现这些网站已经全站使用 HTTPS。同时,iOS...

腾讯Bugly
2015/12/25
2K
5
元注解:@Retention 在hbase中用于获取确定高优先级的RPC操作

概念 注解@Retention可以用来修饰注解,是注解的注解,称为元注解。 Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型, 这个枚举决定了Retenti...

cloud-coder
2014/12/24
396
1
获取spring 的bean 方法总结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢? Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的...

hello菜bird
2016/01/08
9.6K
16
获取微信XML格式中传来的图片并保存到本地

微信开启防外链后,一种方法是绕开外链,另一种方法自然是将图片保存到本地,在取的时候从本地去获取图片,那么如何从微信返回的XML格式中获取到图片的地址并且下载保存呢,代码如下:

wsy940822
2016/03/17
1.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

搞网站的你,不了解一下共享虚拟主机和备案问题

正文共:1474字 14图,预估阅读时间:4 分钟 今天分享的这一切要从域名备案说起。先科普一下,平时我们访问网站都是用域名访问的,通过DNS服务器将域名解析为IP地址(你知道上网时输入的URL...

郭松成
昨天
0
0
10 分钟学会 pillow 图像处理 16 式

PIL:Python Imaging Library,是Python环境下最受欢迎的图像处理库之一。 pillow简单优雅而功能强大,是图像相关机器学习任务中算法工程师的亲密合作伙伴。 我们将介绍pillow的如下16个图片...

zglg
昨天
0
0
3大排行榜告诉你,Java&Python有多稳

什么编程语言最受欢迎? 零基础小白学什么语言最好找工作? …… 关于这些问题的讨论从来都没停止 今天领扣🐱就来盘点一下 如今最受欢迎的语言到底是什么 Java&Python学习大礼包 资料领取方...

Lintcode
今天
3
0
这道原题答出来了还是跪!今年面试也太难了……

秋招已然到来,Amazon这不又发了一堆岗位,此时可以说是上岸最好机会!不过上周有同学反馈面试亚麻,遇到一题曾经刷过,惨的是最后还是跪了,班班仔细一问原来是这道。 给定一个整数序列,找...

九章算法
今天
0
0
【你只需看一次】YOLO 全系列目标检测算法

文章目录 一、概述 二、Yolo系列全家桶 YOLOv1 开山鼻祖之作 YOLOv2 YOLOv3 YOLOv4 目标检测tricks集大成者 YOLOv5 Fast YOLO Complex-YOLO MV-YOLO YOLO3D YOLO-6D YOLO-LITE Spiking-YOLO ......

osc_5p8bxoq2
14分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部