我正在编写自己的方法,用C生成随机数,如下所示:
int randomNumber(){
int catch = *pCOUNTER;
int temp = catch;
temp /= 10;
temp *= 10;
return (catch - temp);
}
pCounter
基本上是指向我正在使用的设备中的寄存器的指针。该寄存器中的数字总是在增加,所以我的想法是只取第一个数字。
在某些时候,返回的数字大于9,我不确定问题是在我的代码或设备本身。该器件是Altera DE1板。
有人可以帮忙吗?
谢谢!
答案 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',否则它是一个神奇的数字。