-1

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

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

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

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

有人可以帮忙吗?

谢谢!

4

6 回答 6

4

您是否声明pCounter为易失性?

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

int randomNumber(){
    return *pCounter % 10;
}
于 2011-04-07T23:33:54.090 回答
1

你确定你不想用 %= 代替 /= & *= 吗?

于 2011-04-07T23:28:13.217 回答
1

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

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

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

于 2011-04-07T23:30:55.710 回答
1

我怀疑您的问题可能是编译器引入的“优化” - 如果您没有pCOUNTER声明正确的波动性,编译器可能会多次读取指针。我不知道您的处理器可能有多少寄存器 - 如果没有足够的寄存器保存catch在寄存器中,它可能会多次读取它(一次是为了得到一些东西来进行temp计算,然后是为了最终的返回值)。

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

int randomNumber(){  
    int catch = *(int volatile*)pCOUNTER;  
    int temp = catch;  
    temp /= 10;  
    temp *= 10;  
    return (catch - temp);  
}
于 2011-04-07T23:35:30.187 回答
0

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

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

不过,这不是很随机。如果它一直在增加,大概以已知的速度增加,那么它是 100% 可预测的,根本不是随机的。

rand()那个Altera板上不允许这个功能吗?

编辑:

你总是可以编写自己的 PRNG。我在 Google 上搜索了“简单随机数生成器代码”,并找到了几个简单的示例。最简单的方法如下:

int randomNumber()
{
    static long a = SomeSeedValue;

    a = (a * SomeNumber + AnotherNumber) % SomeLargePrimeNumber;
    return a % 65536;
}
于 2011-04-07T23:33:41.513 回答
-1

如果要任意将结果限制为 9:

return (catch - temp)%10;

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

于 2011-04-07T23:30:45.157 回答