我正在尝试让下面的代码在斐波那契移位寄存器上工作,以生成伪随机数。似乎不能让它工作,那么()有什么明显的问题(?)
Shared Function Main() As Integer
Dim start_state As UShort = &HACE1UI ' Any nonzero start state will work.
Dim lfsr As UShort = start_state
Dim bit As UInteger
Dim period As UInteger = 0
Do While lfsr <> start_state
' taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1
bit = ((lfsr >> 0) Xor (lfsr >> 2) Xor (lfsr >> 3) Xor (lfsr >> 5)) And 1
lfsr = (lfsr >> 1) Or (bit << 15)
period += 1
Loop
Return 0
End Function最后,"period“是否需要除以一个大整数才能得到U(0,1)?
以下是原始的C++代码:
# include <stdint.h>
int main(void)
{
uint16_t start_state = 0xACE1u; /* Any nonzero start state will work. */
uint16_t lfsr = start_state;
uint16_t bit; /* Must be 16bit to allow bit<<15 later in the code */
unsigned period = 0;
do
{
/* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */
bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
lfsr = (lfsr >> 1) | (bit << 15);
++period;
} while (lfsr != start_state);
return 0;
}发布于 2015-11-04 15:25:06
就像@dummy的评论一样,
Do While lfsr <> start_state
...
Loop不会运行,因为一开始就是lfsr = start_state。
相当于C++的代码
do {
...
} while (lfsr != start_state);在VB.NET中是
Do
...
Loop While lfsr <> start_statehttps://stackoverflow.com/questions/33499354
复制相似问题