C中的随机数

时间:2011-04-07 23:25:31

标签: c intel-fpga

我正在编写自己的方法,用C生成随机数,如下所示:

int randomNumber(){  
    int catch = *pCOUNTER;  
    int temp = catch;  
    temp /= 10;  
    temp *= 10;  
    return (catch - temp);  
}

pCounter基本上是指向我正在使用的设备中的寄存器的指针。该寄存器中的数字总是在增加,所以我的想法是只取第一个数字。

在某些时候,返回的数字大于9,我不确定问题是在我的代码或设备本身。该器件是Altera DE1板。

有人可以帮忙吗?

谢谢!

6 个答案:

答案 0 :(得分:4)

您是否将pCounter声明为易变?

volatile unsigned *pCounter = (unsigned *)0xBADDECAF;

int randomNumber(){
    return *pCounter % 10;
}

答案 1 :(得分:1)

你确定你不想使用%=而不是/ =& * =?

答案 2 :(得分:1)

要实现您在代码中尝试执行的操作:

int catch = *pCOUNTER;
return (catch % 10); // Returns only the ones digit

但是,我怀疑这种方法是否接近于合理随机......

答案 3 :(得分:1)

我怀疑你的问题可能是编译器引入的'优化' - 如果你没有声明具有正确波动率的pCOUNTER,编译器可能会多次读取指针。我不知道你的处理器可能有多少个寄存器 - 如果没有足够的值来保存寄存器中的catch,它可能会多次读取它(一次就可以进行temp计算,以及再次为最终的返回值)。

请尝试以下操作,这应确保只读取pCOUNTER设备/寄存器一次:

int randomNumber(){  
    int catch = *(int volatile*)pCOUNTER;  
    int temp = catch;  
    temp /= 10;  
    temp *= 10;  
    return (catch - temp);  
}

答案 4 :(得分:0)

如果您正在寻找一个随机数字(仅限0-9),请尝试修改您的方法。

int randomNumber(){  
    return ((*pCOUNTER) % 10);  
}

但这并不是随机的。如果它总是增加,大概是以已知的速度增加,那么它是100%可预测的,而不是随机的。

Altera电路板上是否不允许使用rand()功能?

修改

您可以随时编写自己的PRNG。我在Google上搜索了“简单的随机数生成器代码”,并找到了几个简单的例子。最简单的是这些:

int randomNumber()
{
    static long a = SomeSeedValue;

    a = (a * SomeNumber + AnotherNumber) % SomeLargePrimeNumber;
    return a % 65536;
}

答案 5 :(得分:-1)

如果您想任意将结果限制为9:

return (catch - temp)%10;

我建议使用宏常量来抽象'10',否则它是一个神奇的数字。