-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

あなたの問題は、コンパイラによって導入された「最適化」である可能性があると思われます.pCOUNTER正しいボラティリティで宣言していない場合、コンパイラはポインタを複数回読み取っている可能性があります. プロセッサがいくつのレジスタを持っているかわかりません-catchレジスタに保持するのに十分でない場合、レジスタを複数回読み取る可能性があります(1回は計算を行うために何かを取得しtemp、再び最終的な戻り値のために)。

次のことを試してください。これにより、pCOUNTERデバイス/レジスタが 1 回だけ読み取られるようになります。

int randomNumber(){  
    int catch = *(int volatile*)pCOUNTER;  
    int temp = catch;  
    temp /= 10;  
    temp *= 10;  
    return (catch - temp);  
}
于 2011-04-07T23:35:30.187 に答える
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 に答える
0

ランダムな数字 (0 ~ 9 のみ) を探している場合は、このメソッドの変更を試してください。

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

ただし、これはあまりランダムではありません。おそらく既知の割合​​で常に増加している場合は、100% 予測可能であり、まったくランダムではありません。

rand()そのアルテラのボードでは機能が許可されていませんか?

編集:

いつでも独自の 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 に答える