Gorgon_Meducer 发表于 2010-4-16 18:17:13

[LIB][C99]一个简单的伪随机数发生算法

本帖最后由 Gorgon_Meducer 于 2014-3-6 13:41 编辑


东西不复杂,我就不罗嗦了。当然,需要说明下,这个算法是我原创的。
如有雷同,纯属巧合。

此代码纯属交流目的,如用作安全领域,后果自负

#include <stdint.h>
#include <stdlib.h>


//! \brief random seed
static uint16_t s_hwRandomSeed = 0xAA55;
static uint8_t s_chRandomTable[] = {
                0x12,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
                0xF1,0xE2,0xD3,0xC4,0xB5,0xA6,0x97,0x88};


/*! \note set random generator seed
*\param hwSeed random seed
*\return none
*/
void set_random_seed( uint16_t hwSeed )
{
    s_hwRandomSeed ^= hwSeed;
}

/*! \note get a random integer
*\param none
*\return random integer value
*/
uint16_t get_random_u16( void )
{
    uint16_t *phwResult = (uint16_t *)&s_chRandomTable[(s_hwRandomSeed & 0x0E)];
   
    *phwResult += s_hwRandomSeed;
    s_hwRandomSeed ^= *phwResult;
   
    return *phwResult;
}

/*! \note get a random byte
*\param none
*\return random integer value
*/
uint8_t get_random_u8( void )
{
    return get_random_u16();
}

dianzidog 发表于 2010-4-16 18:21:15

单片机搞随机数比较简单,对悬空AD脚采样就行了

Gorgon_Meducer 发表于 2010-4-16 18:32:12

to 【1楼】 dianzidog
    是一个方法,不过系统时间太长……而且万一引脚没有悬空呢……万一还有其他AD应用呢?
你的PCB上会悬空引脚么?如果是一个低功耗应用呢?不允许悬空引脚……

cgbabc 发表于 2010-4-16 19:30:16

学习

cortex-m0 发表于 2010-4-16 19:47:25

不知随机数应用在哪?

dianzidog 发表于 2010-4-16 19:54:38

回复【2楼】Gorgon Meducer傻孩子
to 【1楼】 dianzidog
    是一个方法,不过系统时间太长……而且万一引脚没有悬空呢……万一还有其他AD应用呢?
你的PCB上会悬空引脚么?如果是一个低功耗应用呢?不允许悬空引脚……
-----------------------------------------------------------------------

AVR某些引脚是只能用在ad上,不能做io的。而且这个是物理上的随机。

dianzidog 发表于 2010-4-16 19:56:44

当然,用算法实现随机序列,时间比较短,但统计上的分布不是那么随机

Gorgon_Meducer 发表于 2010-4-16 20:30:22

to 【6楼】 dianzidog
    并不是所有AVR芯片都有这样的AD引脚,而且有的封装有有的没有,典型的就是
M8的DIP和M8的TQFP……
    这个算法最大的特点就是“伪”。

qhshilin 发表于 2010-4-16 22:00:32

>>>>>>>>>>>>>>>>>

snoopyzz 发表于 2010-4-16 22:15:47

最常用的随机算法,C语言标准库函数的结果和这个一致
这里是32位机用的,8位机自己加UL,改int为long

int seed;

void srand(int s)
{
    seed = s;
}

int rand()
{
    seed = seed * 22695477 + 1;
}

avrpicarm 发表于 2010-4-16 22:56:54

支持原创,

mcu_lover 发表于 2010-4-16 22:59:31

傻大侠帖子,死了也要顶

yangyi 发表于 2010-4-17 00:30:53

支持原创,感谢分享!

zhenke 发表于 2010-4-17 01:05:07

谢谢!Mark!

hongyancl 发表于 2010-4-17 09:23:24

dddd

eduhf_123 发表于 2010-4-18 17:16:05

MARK 随机数

ggyyll8683 发表于 2010-4-18 18:14:57

学习,感谢傻孩子分享!

sunzhaod 发表于 2010-4-18 20:19:19

mark

myhonour 发表于 2010-4-18 22:22:02

mark

ilawp 发表于 2010-4-18 23:29:36

mark

mcucow 发表于 2010-4-19 00:24:43

回复【1楼】dianzidog
单片机搞随机数比较简单,对悬空AD脚采样就行了
-----------------------------------------------------------------------

以前也用过, 不过真有个万一的情况, 看看这个算法, 顶起

psocfans 发表于 2010-5-11 17:36:42

mark

bad_fpga 发表于 2010-5-11 17:53:13

MARK

wanglituan 发表于 2010-5-11 18:24:34

顶起

david168 发表于 2010-5-13 11:41:42

精华 标记一下

dengting 发表于 2010-7-4 02:46:07

自己先造一个大滚轮,这种方法常用于加密。
但随机数的话,出现雷同循环的数量取决滚轮的大小。

dengting 发表于 2010-7-4 02:48:20

回复【20楼】mcucow
回复【1楼】dianzidog
单片机搞随机数比较简单,对悬空ad脚采样就行了
-----------------------------------------------------------------------
以前也用过, 不过真有个万一的情况, 看看这个算法, 顶起
-----------------------------------------------------------------------

AD用来产生随机,请教,AD外围电路怎么搭?
又是怎样使用的呢?例如我要16位的随机数,怎样产生?我要32位的随机数,又怎样产生?随机出现的范围是不是0x0000000到0xffffffff呢?
太多的疑问。。。

Spunky 发表于 2010-7-4 13:10:05

这个算法是完全可以预测的,安全性太差!
AD脚浮空倒是个办法,浮空脚加二极管钳位,需要产生随机数的时候打开AD读取,也不影响低功耗。
另外一个就是随即读取晶振的计数寄存器,同样可以获得随即数,方法很多!

Gorgon_Meducer 发表于 2010-7-5 09:59:04

to 【27楼】 Spunky
    没有说这个算法要用于安全用途阿。而且,库函数提供的方法本身也是具有可预知性的。
不然怎么叫做伪随机数。不过说句实话,你实际测试过要连续取多少个数据才会出现重复么?
另外,浮空AD获得的只是一个范围较小的随机数,可以说,精度是不够的。不过,如果使用
AD的采样结果来作为随机数的种子,倒是一个很不错的解决方案。

projectbox 发表于 2010-7-21 22:52:24

什么原理?没看明白

Notting_Hill 发表于 2010-8-13 14:42:49

mark 不错 随机数

moon0213 发表于 2010-8-13 14:50:42

MARK

jasonli 发表于 2010-8-30 11:45:41

mark

xjmlfm1 发表于 2010-8-30 12:59:47

mark

gdmfq 发表于 2010-8-31 11:04:32

liulwn 发表于 2010-8-31 11:43:03

mark

watch1030 发表于 2010-11-3 11:40:21

mark

wanyou132 发表于 2010-11-3 16:57:16

MARK 随机数

ag_wang 发表于 2010-12-19 19:18:28

手下,随机数

embeddev 发表于 2011-3-16 10:51:55

说说原理?

chenlijian80 发表于 2011-5-21 16:50:52

我的做法是用中断做个定时器,定时器里面做个16位的计数器。计数器在0-66535之间循环技术,当需要随机数的时候随时提取计数器里面的值就可以了。。

Gorgon_Meducer 发表于 2011-5-21 18:23:46

to 【40楼】 chenlijian80
    在某些场合下,你的随机数会有规律性……

usr.cn 发表于 2011-5-21 19:58:59

看应用了,伪的随机也有存在的价值。

stone2006 发表于 2012-12-28 15:10:15

mark
跳频

modelfly 发表于 2012-12-30 22:44:26

我比较喜欢读定时器的值。

jjj 发表于 2012-12-30 23:20:36

我也是用记数器

jeoge 发表于 2013-1-7 17:11:42

本帖最后由 jeoge 于 2013-1-7 17:13 编辑

还不如在时间中断里放一个计数器,随时取来用,取的数当然也是随机的,并且计数范围也是可以控制的。

鼎邑 发表于 2013-3-17 00:23:14

没有用过,但是mark下。

younge 发表于 2013-4-14 21:24:01

Gorgon_Meducer 发表于 2010-7-5 09:59 static/image/common/back.gif
to 【27楼】 Spunky
    没有说这个算法要用于安全用途阿。而且,库函数提供的方法本身也是具有可预知性 ...

设置一个指针变量,指向ram里面的某个单元,需要时候读那个单元的数据作为随机数种子。因为程序运行时,ram的值可能因为实际情况随机变化……
除了程序可靠性隐患,不知还有没其他隐患

jiaokx 发表于 2013-4-19 12:33:37

新手路过,

司马朝阳 发表于 2013-5-7 19:29:37

没学过 但是看看学学

seeyou2013 发表于 2013-5-15 14:22:11

路过,帮顶了

wenjinzaime 发表于 2013-6-9 10:47:03

支持下,多多交流才会有新东西出来!

mcuandmex 发表于 2013-12-10 20:46:52

好贴 不过没用过还是没有懂
AD 计数器 指针
都可以产生随机数

滴答滴答下雨啦 发表于 2013-12-19 22:06:10

学习了……

dgdzas 发表于 2014-1-10 11:57:19

younge 发表于 2013-4-14 21:24
设置一个指针变量,指向ram里面的某个单元,需要时候读那个单元的数据作为随机数种子。因为程序运行时,r ...

利用用的最多的暂存器即可

wazhiyi 发表于 2014-1-10 12:02:08

提供了一种不错的思路

hygs 发表于 2014-2-25 16:55:34

谢谢分享

bondxie3 发表于 2014-3-6 12:55:38

傻孩子出品必是精品!

dongfo 发表于 2014-4-17 09:47:20

简单实用,9错

Micheal_J 发表于 2014-4-20 10:42:20

谢谢分享,正努力学习中

YANGTUTAI 发表于 2014-4-22 00:19:01

buchuo ths..

ray1136 发表于 2014-6-25 11:21:27

                            mark

xiaoyonggo 发表于 2014-6-26 15:19:29

mark一下。

gwuyu 发表于 2014-10-29 21:54:53

学习了,mark一下。

jingmeidz 发表于 2014-10-30 23:38:31

收藏先,会用上的

Ray______ 发表于 2014-11-30 21:06:58

原来可以用AD口采随机数~~~受教{:lol:}

liudijiang 发表于 2014-12-3 11:51:31

顶顶顶!!!!!!!!

xiong57785 发表于 2014-12-31 13:43:05

mark随机数   

vivi_cq1982 发表于 2015-1-13 17:46:16

mark......

retome 发表于 2015-11-14 09:00:40

不错{:smile:} 学习了·

eryueniao 发表于 2015-12-25 10:17:15

本帖最后由 eryueniao 于 2015-12-25 10:44 编辑

haha学习啦,我用RTC做种子    。

   
   为什么是返回 return *phwResult;   这个值,而不是    s_hwRandomSeed                     

ccitlad 发表于 2015-12-25 17:00:13

随机数 学习了!

yanzhiwei 发表于 2015-12-26 15:29:04

支持原创

ldx24511 发表于 2016-4-22 16:19:08

我是通过AD+高速计数器+上电次数做为种子计算的

yangbo18416 发表于 2016-10-24 16:22:07

收藏,最近准备弄跳频这一块

vsdcjs 发表于 2017-3-15 10:05:56

很不错的

amiok 发表于 2017-11-11 20:23:15

make~~~~~标记。

Ray______ 发表于 2017-11-11 22:06:11

用单次或者周期数次获取真的随机数做种子,配合伪随机发生器能到达真随机的效果吗。

Gorgon_Meducer 发表于 2017-11-11 23:27:52

本帖最后由 Gorgon_Meducer 于 2017-11-11 23:28 编辑

Ray______ 发表于 2017-11-11 22:06
用单次或者周期数次获取真的随机数做种子,配合伪随机发生器能到达真随机的效果吗。 ...

“伪”随机数发生器发生出来的,本身就是伪随机的。做种子只不过是把取数的空间扩大而已
不可能是随机的。但是,如果用2到3个甚至更多不同规则的伪随机发生器以顺序的方式依次
产生随机数,这个就产生了混沌(Chaotic),那么就具有随机性了。

关键点就是,要打破函数的线性关系(一一对应),同时增加推演的级数。打破一一对应关系
其实很简单,远的不说,算CheckSum就是打破了一一对应关系——因为是把一堆数的单向
散列算出来了。然后用伪随机来打破线性关系,并增加多级这样的推演过程,就是破坏了还原
主义(Reductionism)成立的基本条件了。

darkness27 发表于 2017-11-12 00:18:24

感谢分享,可不可以介绍一下原理思路呢?
很喜欢您的分享。

1826772880 发表于 2017-11-18 12:42:59

eryueniao 发表于 2015-12-25 10:17
haha学习啦,我用RTC做种子    。

   


粗略看了下,s_hwRandomSeed这个值是作为下次运算用的吧,正所谓不固定
页: [1]
查看完整版本: [LIB][C99]一个简单的伪随机数发生算法