Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用8位MCU生成伪随机数的最快方法是什么?_C_Random_Microcontroller_8051_8 Bit - Fatal编程技术网

用8位MCU生成伪随机数的最快方法是什么?

用8位MCU生成伪随机数的最快方法是什么?,c,random,microcontroller,8051,8-bit,C,Random,Microcontroller,8051,8 Bit,这是一个很好的算法。但是有更快的算法吗?没有,没有通过通用CPU实现的速度明显更快的算法。正如@Joachim Isaksson和@Michael Burr所提到的,如果不降低质量或做一些奇怪的事情,就没有多少事情可以做。g:在编译时计算一个巨大的随机数列表,那么运行时生成速度很快 任何真正快速的随机数发生器都使用专门的硬件。既然您已经标记了[微控制器],请查看您正在使用的处理器,看看它可能提供哪些特殊功能 进一步:为您的PRN需求提供更多信息可能有助于引出一些新颖的想法(数字长度、速度:O(n

这是一个很好的算法。但是有更快的算法吗?

没有,没有通过通用CPU实现的速度明显更快的算法。正如@Joachim Isaksson和@Michael Burr所提到的,如果不降低质量或做一些奇怪的事情,就没有多少事情可以做。g:在编译时计算一个巨大的随机数列表,那么运行时生成速度很快

任何真正快速的随机数发生器都使用专门的硬件。既然您已经标记了[微控制器],请查看您正在使用的处理器,看看它可能提供哪些特殊功能


进一步:为您的PRN需求提供更多信息可能有助于引出一些新颖的想法(数字长度、速度:O(n)或时间、随机度等),比如使用由大素数调制的微控制器基于时间的计数器。

因为8位CPU通常不能进行快速除法甚至乘法,使用线性同余生成器通常不是一个好主意

仅使用移位和逻辑操作

如果使用数组,它将成为广义线性反馈移位寄存器(GLFSR),这是使用的一般方法。它在数组中循环,而不是在每一步移动所有位,这样您就可以用很少的计算工作量获得一个大的状态空间(数百到数千位)

请注意,由于它是一种线性方法,因此不适用于加密。

我记得,它有一个8x8=16位的乘法器,因此实现lag-n生成器可能是可行的。这种技术的优点是,如果你能找到一个合适的安全素数,你可以用很少的运算得到一个很长的周期

不幸的是,只有8位乘法器的安全素数选项似乎并不多,我担心短乘法器可能会导致一些通常在MWC中不会出现的缺点

我只是把它拼凑起来,虽然我不是100%确定它正确地实现了MWC,但它实际上通过了数量惊人的测试:

如您所见,乘法器实际上是九位的,但我们使用移位和加法来实现硬件乘法器无法管理的最后一位

在进一步的测试中,我找到了一个合适的89位安全素数,它几乎通过了所有的测试。更改这些行:

#define STATE_BYTES 10
#define MULT 0x153 /* for STATE_BYTES==10 only */
我用这个种子来测试:

static uint8_t state[STATE_BYTES] =
{ 0x87, 0xdd, 0xdc, 0x10, 0x35, 0xbc, 0x5c, 0xb6, 0xca, 0x0a, };
static uint16_t c = 0x42;

种子只是/dev/random中的一些位,您可以自由选择自己的种子。然而,增加状态大小基本上是作弊,因为它允许种子的质量在随机性测试的成败中发挥更大的作用。可能是坏种子会导致不太随机的结果。

就质量/性能而言,LCG相当不错。据我所知,没有更快的算法不会同时大幅降低生成数据的质量。MWC也很快,而且周期较长。但是,需要保存一些额外的状态。您需要什么样的随机数,用于什么目的?选择一个好的算法很重要。很难比乘法、加法和除法快得多(特别是因为通常只需将乘法/加法运算的结果截断到一定数量的位就可以省去除法)@Michael Burr甚至乘法在8位CPU上通常很昂贵。我对这个问题很感兴趣,所以我对它做了一个研究,并开始测量系数,看看什么效果好。
static uint8_t state[STATE_BYTES] =
{ 0x87, 0xdd, 0xdc, 0x10, 0x35, 0xbc, 0x5c, 0xb6, 0xca, 0x0a, };
static uint16_t c = 0x42;