搜索
bottom↓
回复: 81
打印 上一主题 下一主题

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

  [复制链接]

出0入296汤圆

跳转到指定楼层
1
发表于 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();
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

2
发表于 2010-4-16 18:21:15 | 只看该作者
单片机搞随机数比较简单,对悬空AD脚采样就行了

出0入296汤圆

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

出0入0汤圆

4
发表于 2010-4-16 19:30:16 | 只看该作者
学习

出0入0汤圆

5
发表于 2010-4-16 19:47:25 | 只看该作者
不知随机数应用在哪?

出0入0汤圆

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

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

出0入0汤圆

7
发表于 2010-4-16 19:56:44 | 只看该作者
当然,用算法实现随机序列,时间比较短,但统计上的分布不是那么随机

出0入296汤圆

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

出0入0汤圆

9
发表于 2010-4-16 22:00:32 | 只看该作者
>>>>>>>>>>>>>>>>>

出0入0汤圆

10
发表于 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;
}

出0入0汤圆

11
发表于 2010-4-16 22:56:54 | 只看该作者
支持原创,

出0入264汤圆

12
发表于 2010-4-16 22:59:31 | 只看该作者
傻大侠帖子,死了也要顶

出10入10汤圆

13
发表于 2010-4-17 00:30:53 | 只看该作者
支持原创,感谢分享!

出0入0汤圆

14
发表于 2010-4-17 01:05:07 | 只看该作者
谢谢!Mark!

出0入0汤圆

15
发表于 2010-4-17 09:23:24 | 只看该作者
dddd

出0入0汤圆

16
发表于 2010-4-18 17:16:05 | 只看该作者
MARK 随机数

出0入0汤圆

17
发表于 2010-4-18 18:14:57 | 只看该作者
学习,感谢傻孩子分享!

出0入0汤圆

18
发表于 2010-4-18 20:19:19 | 只看该作者
mark

出0入0汤圆

19
发表于 2010-4-18 22:22:02 | 只看该作者
mark

出0入0汤圆

20
发表于 2010-4-18 23:29:36 | 只看该作者
mark

出0入0汤圆

21
发表于 2010-4-19 00:24:43 | 只看该作者
回复【1楼】dianzidog
单片机搞随机数比较简单,对悬空AD脚采样就行了
-----------------------------------------------------------------------

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

出0入0汤圆

22
发表于 2010-5-11 17:36:42 | 只看该作者
mark

出0入0汤圆

23
发表于 2010-5-11 17:53:13 | 只看该作者
MARK

出0入0汤圆

24
发表于 2010-5-11 18:24:34 | 只看该作者
顶起

出0入0汤圆

25
发表于 2010-5-13 11:41:42 | 只看该作者
精华 标记一下

出0入0汤圆

26
发表于 2010-7-4 02:46:07 | 只看该作者
自己先造一个大滚轮,这种方法常用于加密。
但随机数的话,出现雷同循环的数量取决滚轮的大小。

出0入0汤圆

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

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

出0入0汤圆

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

出0入296汤圆

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

出0入0汤圆

30
发表于 2010-7-21 22:52:24 | 只看该作者
什么原理?没看明白

出0入0汤圆

31
发表于 2010-8-13 14:42:49 | 只看该作者
mark 不错 随机数

出0入0汤圆

32
发表于 2010-8-13 14:50:42 | 只看该作者
MARK

出0入0汤圆

33
发表于 2010-8-30 11:45:41 | 只看该作者
mark

出0入0汤圆

34
发表于 2010-8-30 12:59:47 | 只看该作者
mark

出0入0汤圆

35
发表于 2010-8-31 11:04:32 | 只看该作者

出0入0汤圆

36
发表于 2010-8-31 11:43:03 | 只看该作者
mark

出0入0汤圆

37
发表于 2010-11-3 11:40:21 | 只看该作者
mark

出0入0汤圆

38
发表于 2010-11-3 16:57:16 | 只看该作者
MARK 随机数

出0入0汤圆

39
发表于 2010-12-19 19:18:28 | 只看该作者
手下,随机数

出0入0汤圆

40
发表于 2011-3-16 10:51:55 | 只看该作者
说说原理?

出0入0汤圆

41
发表于 2011-5-21 16:50:52 | 只看该作者
我的做法是用中断做个定时器,定时器里面做个16位的计数器。计数器在0-66535之间循环技术,当需要随机数的时候随时提取计数器里面的值就可以了。。

出0入296汤圆

42
 楼主| 发表于 2011-5-21 18:23:46 | 只看该作者
to 【40楼】 chenlijian80
    在某些场合下,你的随机数会有规律性……

出0入0汤圆

43
发表于 2011-5-21 19:58:59 | 只看该作者
看应用了,伪的随机也有存在的价值。

出0入0汤圆

44
发表于 2012-12-28 15:10:15 | 只看该作者
mark
跳频

出0入0汤圆

45
发表于 2012-12-30 22:44:26 | 只看该作者
我比较喜欢读定时器的值。

出0入0汤圆

46
发表于 2012-12-30 23:20:36 来自手机 | 只看该作者
我也是用记数器

出0入0汤圆

47
发表于 2013-1-7 17:11:42 | 只看该作者
本帖最后由 jeoge 于 2013-1-7 17:13 编辑

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

出0入0汤圆

48
发表于 2013-3-17 00:23:14 | 只看该作者
没有用过,但是mark下。

出0入0汤圆

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

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

出0入0汤圆

50
发表于 2013-4-19 12:33:37 | 只看该作者
新手路过,

出0入0汤圆

51
发表于 2013-5-7 19:29:37 | 只看该作者
没学过 但是看看  学学  

出0入0汤圆

52
发表于 2013-5-15 14:22:11 | 只看该作者
路过,帮顶了

出0入0汤圆

53
发表于 2013-6-9 10:47:03 | 只看该作者
支持下,多多交流才会有新东西出来!

出0入0汤圆

54
发表于 2013-12-10 20:46:52 | 只看该作者
好贴 不过没用过还是没有懂
AD 计数器 指针
都可以产生随机数

出0入0汤圆

55
发表于 2013-12-19 22:06:10 | 只看该作者
学习了……

出0入0汤圆

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

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

出0入0汤圆

57
发表于 2014-1-10 12:02:08 | 只看该作者
提供了一种不错的思路

出0入0汤圆

58
发表于 2014-2-25 16:55:34 | 只看该作者
谢谢分享

出0入0汤圆

59
发表于 2014-3-6 12:55:38 | 只看该作者
傻孩子出品必是精品!

出0入0汤圆

60
发表于 2014-4-17 09:47:20 | 只看该作者
简单实用,9错

出0入0汤圆

61
发表于 2014-4-20 10:42:20 | 只看该作者
谢谢分享,正努力学习中

出0入0汤圆

62
发表于 2014-4-22 00:19:01 | 只看该作者
buchuo ths..

出0入0汤圆

63
发表于 2014-6-25 11:21:27 | 只看该作者
                            mark

出0入0汤圆

64
发表于 2014-6-26 15:19:29 | 只看该作者
mark一下。

出0入0汤圆

65
发表于 2014-10-29 21:54:53 | 只看该作者
学习了,mark一下。

出0入0汤圆

66
发表于 2014-10-30 23:38:31 | 只看该作者
收藏先,会用上的

出0入0汤圆

67
发表于 2014-11-30 21:06:58 | 只看该作者
原来可以用AD口采随机数~~~受教

出0入0汤圆

68
发表于 2014-12-3 11:51:31 | 只看该作者
顶顶顶!!!!!!!!

出0入0汤圆

69
发表于 2014-12-31 13:43:05 | 只看该作者
mark  随机数   

出0入0汤圆

70
发表于 2015-1-13 17:46:16 | 只看该作者
mark......

出0入0汤圆

71
发表于 2015-11-14 09:00:40 | 只看该作者
不错 学习了·

出0入0汤圆

72
发表于 2015-12-25 10:17:15 | 只看该作者
本帖最后由 eryueniao 于 2015-12-25 10:44 编辑

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

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

出0入0汤圆

73
发表于 2015-12-25 17:00:13 | 只看该作者
随机数 学习了!

出0入0汤圆

74
发表于 2015-12-26 15:29:04 | 只看该作者
支持原创  

出0入0汤圆

75
发表于 2016-4-22 16:19:08 | 只看该作者
我是通过AD+高速计数器+上电次数做为种子计算的

出0入0汤圆

76
发表于 2016-10-24 16:22:07 | 只看该作者
收藏,最近准备弄跳频这一块

出0入0汤圆

77
发表于 2017-3-15 10:05:56 | 只看该作者
很不错的

出0入0汤圆

78
发表于 2017-11-11 20:23:15 | 只看该作者
make~~~~~标记。

出0入0汤圆

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

出0入296汤圆

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


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

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

出0入0汤圆

81
发表于 2017-11-12 00:18:24 | 只看该作者
感谢分享,可不可以介绍一下原理思路呢?
很喜欢您的分享。

出0入0汤圆

82
发表于 2017-11-18 12:42:59 | 只看该作者
eryueniao 发表于 2015-12-25 10:17
haha学习啦,我用RTC做种子    。

   

粗略看了下,s_hwRandomSeed这个值是作为下次运算用的吧,正所谓不固定
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 17:43

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

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