搜索
bottom↓
回复: 81

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

  [复制链接]
(371631755)

出0入296汤圆

发表于 2010-4-16 18:17:13 | 显示全部楼层 |阅读模式
本帖最后由 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();
}
(371631513)

出0入0汤圆

发表于 2010-4-16 18:21:15 | 显示全部楼层
单片机搞随机数比较简单,对悬空AD脚采样就行了
(371630856)

出0入296汤圆

 楼主| 发表于 2010-4-16 18:32:12 | 显示全部楼层
to 【1楼】 dianzidog
    是一个方法,不过系统时间太长……而且万一引脚没有悬空呢……万一还有其他AD应用呢?
你的PCB上会悬空引脚么?如果是一个低功耗应用呢?不允许悬空引脚……
(371627372)

出0入0汤圆

发表于 2010-4-16 19:30:16 | 显示全部楼层
学习
(371626343)

出0入0汤圆

发表于 2010-4-16 19:47:25 | 显示全部楼层
不知随机数应用在哪?
(371625910)

出0入0汤圆

发表于 2010-4-16 19:54:38 | 显示全部楼层
回复【2楼】Gorgon Meducer  傻孩子
to&#160;【1楼】&#160;dianzidog
&#160;&#160;&#160;&#160;是一个方法,不过系统时间太长……而且万一引脚没有悬空呢……万一还有其他AD应用呢?
你的PCB上会悬空引脚么?如果是一个低功耗应用呢?不允许悬空引脚……
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-4-16 19:56:44 | 显示全部楼层
当然,用算法实现随机序列,时间比较短,但统计上的分布不是那么随机
(371623766)

出0入296汤圆

 楼主| 发表于 2010-4-16 20:30:22 | 显示全部楼层
to 【6楼】 dianzidog
    并不是所有AVR芯片都有这样的AD引脚,而且有的封装有有的没有,典型的就是
M8的DIP和M8的TQFP……
    这个算法最大的特点就是“伪”。
(371618356)

出0入0汤圆

发表于 2010-4-16 22:00:32 | 显示全部楼层
>>>>>>>>>>>>>>>>>
(371617441)

出0入0汤圆

发表于 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;
}
(371614974)

出0入0汤圆

发表于 2010-4-16 22:56:54 | 显示全部楼层
支持原创,
(371614817)

出0入247汤圆

发表于 2010-4-16 22:59:31 | 显示全部楼层
傻大侠帖子,死了也要顶
(371609335)

出10入10汤圆

发表于 2010-4-17 00:30:53 | 显示全部楼层
支持原创,感谢分享!
(371607281)

出0入0汤圆

发表于 2010-4-17 01:05:07 | 显示全部楼层
谢谢!Mark!
(371577384)

出0入0汤圆

发表于 2010-4-17 09:23:24 | 显示全部楼层
dddd
(371462623)

出0入0汤圆

发表于 2010-4-18 17:16:05 | 显示全部楼层
MARK 随机数
(371459091)

出0入0汤圆

发表于 2010-4-18 18:14:57 | 显示全部楼层
学习,感谢傻孩子分享!
(371451629)

出0入0汤圆

发表于 2010-4-18 20:19:19 | 显示全部楼层
mark
(371444266)

出0入0汤圆

发表于 2010-4-18 22:22:02 | 显示全部楼层
mark
(371440212)

出0入0汤圆

发表于 2010-4-18 23:29:36 | 显示全部楼层
mark
(371436905)

出0入0汤圆

发表于 2010-4-19 00:24:43 | 显示全部楼层
回复【1楼】dianzidog
单片机搞随机数比较简单,对悬空AD脚采样就行了
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-5-11 17:36:42 | 显示全部楼层
mark
(369473195)

出0入0汤圆

发表于 2010-5-11 17:53:13 | 显示全部楼层
MARK
(369471314)

出0入0汤圆

发表于 2010-5-11 18:24:34 | 显示全部楼层
顶起
(369322686)

出0入0汤圆

发表于 2010-5-13 11:41:42 | 显示全部楼层
精华 标记一下
(364862021)

出0入0汤圆

发表于 2010-7-4 02:46:07 | 显示全部楼层
自己先造一个大滚轮,这种方法常用于加密。
但随机数的话,出现雷同循环的数量取决滚轮的大小。
(364861888)

出0入0汤圆

发表于 2010-7-4 02:48:20 | 显示全部楼层
回复【20楼】mcucow
回复【1楼】dianzidog  
单片机搞随机数比较简单,对悬空ad脚采样就行了
-----------------------------------------------------------------------
以前也用过, 不过真有个万一的情况, 看看这个算法, 顶起
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-7-4 13:10:05 | 显示全部楼层
这个算法是完全可以预测的,安全性太差!
AD脚浮空倒是个办法,浮空脚加二极管钳位,需要产生随机数的时候打开AD读取,也不影响低功耗。
另外一个就是随即读取晶振的计数寄存器,同样可以获得随即数,方法很多!
(364749644)

出0入296汤圆

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

出0入0汤圆

发表于 2010-7-21 22:52:24 | 显示全部楼层
什么原理?没看明白
(361363019)

出0入0汤圆

发表于 2010-8-13 14:42:49 | 显示全部楼层
mark 不错 随机数
(361362546)

出0入0汤圆

发表于 2010-8-13 14:50:42 | 显示全部楼层
MARK
(359904847)

出0入0汤圆

发表于 2010-8-30 11:45:41 | 显示全部楼层
mark
(359900401)

出0入0汤圆

发表于 2010-8-30 12:59:47 | 显示全部楼层
mark
(359820916)

出0入0汤圆

发表于 2010-8-31 11:04:32 | 显示全部楼层
(359818605)

出0入0汤圆

发表于 2010-8-31 11:43:03 | 显示全部楼层
mark
(354289167)

出0入0汤圆

发表于 2010-11-3 11:40:21 | 显示全部楼层
mark
(354270152)

出0入0汤圆

发表于 2010-11-3 16:57:16 | 显示全部楼层
MARK 随机数
(350287280)

出0入0汤圆

发表于 2010-12-19 19:18:28 | 显示全部楼层
手下,随机数
(342800873)

出0入0汤圆

发表于 2011-3-16 10:51:55 | 显示全部楼层
说说原理?
(337076936)

出0入0汤圆

发表于 2011-5-21 16:50:52 | 显示全部楼层
我的做法是用中断做个定时器,定时器里面做个16位的计数器。计数器在0-66535之间循环技术,当需要随机数的时候随时提取计数器里面的值就可以了。。
(337071362)

出0入296汤圆

 楼主| 发表于 2011-5-21 18:23:46 | 显示全部楼层
to 【40楼】 chenlijian80
    在某些场合下,你的随机数会有规律性……
(337065649)

出0入0汤圆

发表于 2011-5-21 19:58:59 | 显示全部楼层
看应用了,伪的随机也有存在的价值。
(286366173)

出0入0汤圆

发表于 2012-12-28 15:10:15 | 显示全部楼层
mark
跳频
(286166122)

出0入0汤圆

发表于 2012-12-30 22:44:26 | 显示全部楼层
我比较喜欢读定时器的值。
(286163952)

出0入0汤圆

发表于 2012-12-30 23:20:36 来自手机 | 显示全部楼层
我也是用记数器
(285494886)

出0入0汤圆

发表于 2013-1-7 17:11:42 | 显示全部楼层
本帖最后由 jeoge 于 2013-1-7 17:13 编辑

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

出0入0汤圆

发表于 2013-3-17 00:23:14 | 显示全部楼层
没有用过,但是mark下。
(277098947)

出0入0汤圆

发表于 2013-4-14 21:24:01 | 显示全部楼层
Gorgon_Meducer 发表于 2010-7-5 09:59
to 【27楼】 Spunky  
    没有说这个算法要用于安全用途阿。而且,库函数提供的方法本身也是具有可预知性 ...

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

出0入0汤圆

发表于 2013-4-19 12:33:37 | 显示全部楼层
新手路过,
(275118611)

出0入0汤圆

发表于 2013-5-7 19:29:37 | 显示全部楼层
没学过 但是看看  学学  
(274445857)

出0入0汤圆

发表于 2013-5-15 14:22:11 | 显示全部楼层
路过,帮顶了
(272298765)

出0入0汤圆

发表于 2013-6-9 10:47:03 | 显示全部楼层
支持下,多多交流才会有新东西出来!
(256365176)

出0入0汤圆

发表于 2013-12-10 20:46:52 | 显示全部楼层
好贴 不过没用过还是没有懂
AD 计数器 指针
都可以产生随机数
(255582818)

出0入0汤圆

发表于 2013-12-19 22:06:10 | 显示全部楼层
学习了……
(253718549)

出0入0汤圆

发表于 2014-1-10 11:57:19 | 显示全部楼层
younge 发表于 2013-4-14 21:24
设置一个指针变量,指向ram里面的某个单元,需要时候读那个单元的数据作为随机数种子。因为程序运行时,r ...

利用用的最多的暂存器即可
(253718260)

出0入0汤圆

发表于 2014-1-10 12:02:08 | 显示全部楼层
提供了一种不错的思路
(249726254)

出0入0汤圆

发表于 2014-2-25 16:55:34 | 显示全部楼层
谢谢分享
(248963050)

出0入0汤圆

发表于 2014-3-6 12:55:38 | 显示全部楼层
傻孩子出品必是精品!
(245345548)

出0入0汤圆

发表于 2014-4-17 09:47:20 | 显示全部楼层
简单实用,9错
(245083048)

出0入0汤圆

发表于 2014-4-20 10:42:20 | 显示全部楼层
谢谢分享,正努力学习中
(244947647)

出0入0汤圆

发表于 2014-4-22 00:19:01 | 显示全部楼层
buchuo ths..
(239378301)

出0入0汤圆

发表于 2014-6-25 11:21:27 | 显示全部楼层
                            mark
(239277619)

出0入0汤圆

发表于 2014-6-26 15:19:29 | 显示全部楼层
mark一下。
(228453895)

出0入0汤圆

发表于 2014-10-29 21:54:53 | 显示全部楼层
学习了,mark一下。
(228361277)

出0入0汤圆

发表于 2014-10-30 23:38:31 | 显示全部楼层
收藏先,会用上的
(225691970)

出0入0汤圆

发表于 2014-11-30 21:06:58 | 显示全部楼层
原来可以用AD口采随机数~~~受教
(225466097)

出0入0汤圆

发表于 2014-12-3 11:51:31 | 显示全部楼层
顶顶顶!!!!!!!!
(223040203)

出0入0汤圆

发表于 2014-12-31 13:43:05 | 显示全部楼层
mark  随机数   
(221902412)

出0入0汤圆

发表于 2015-1-13 17:46:16 | 显示全部楼层
mark......
(195581948)

出0入0汤圆

发表于 2015-11-14 09:00:40 | 显示全部楼层
不错 学习了·
(192034953)

出0入0汤圆

发表于 2015-12-25 10:17:15 | 显示全部楼层
本帖最后由 eryueniao 于 2015-12-25 10:44 编辑

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

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

出0入0汤圆

发表于 2015-12-25 17:00:13 | 显示全部楼层
随机数 学习了!
(191929844)

出0入0汤圆

发表于 2015-12-26 15:29:04 | 显示全部楼层
支持原创  
(181731640)

出0入0汤圆

发表于 2016-4-22 16:19:08 | 显示全部楼层
我是通过AD+高速计数器+上电次数做为种子计算的
(165747461)

出0入0汤圆

发表于 2016-10-24 16:22:07 | 显示全部楼层
收藏,最近准备弄跳频这一块
(153501232)

出0入0汤圆

发表于 2017-3-15 10:05:56 | 显示全部楼层
很不错的
(132641793)

出0入0汤圆

发表于 2017-11-11 20:23:15 | 显示全部楼层
make~~~~~标记。
(132635617)

出0入0汤圆

发表于 2017-11-11 22:06:11 | 显示全部楼层
用单次或者周期数次获取真的随机数做种子,配合伪随机发生器能到达真随机的效果吗。
(132630716)

出0入296汤圆

 楼主| 发表于 2017-11-11 23:27:52 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2017-11-11 23:28 编辑
Ray______ 发表于 2017-11-11 22:06
用单次或者周期数次获取真的随机数做种子,配合伪随机发生器能到达真随机的效果吗。 ...


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

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

出0入0汤圆

发表于 2017-11-12 00:18:24 | 显示全部楼层
感谢分享,可不可以介绍一下原理思路呢?
很喜欢您的分享。
(132064609)

出0入0汤圆

发表于 2017-11-18 12:42:59 | 显示全部楼层
eryueniao 发表于 2015-12-25 10:17
haha学习啦,我用RTC做种子    。

   

粗略看了下,s_hwRandomSeed这个值是作为下次运算用的吧,正所谓不固定
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-1-25 01:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表