2012-05-05 7 views
0

私はOpenGLでパックマンゲームを作っています。私は2つの異なる番号0または1を生成する必要があります。これは、自分のパックマンの方向性に責任があります。 。rand()とsrand()関数opengl visual cpp

rand()関数を使って数値を生成すると、ある数値に対して75%のランダム性を、もう一方の数値にはランダム性を25%生成することができますか?

は私が作る場合:

n = rand() % 3; 

それは2つの異なる番号を取得します。 問題は、作り方が分からないランダム性の割合です。私はちりとカウンターでそれを作ることができます。しかし、私はそれを直接rand()関数で行うことができると言われました。私は検索しますが、Googleでは何も具体的に見つけることができませんでした。

+0

'ランド()'非常にランダムではない、とだけ知っているので、大きなバイアスを持っています。 – chris

+0

あなたは時間の75%ともう1つの数字の25%を選択する必要があることを意味しますか? – Mat

+0

chris:ほとんどの 'rand'実装は、ゲームで使うのに十分です。基本的には、いずれの有用な意味においても「大きなバイアス」はありません。いくつかの実装では、 '% 'で範囲を減らすといくらかのバイアスが導入されますが、パックマンのゲームのプレイヤーがこれまでに気づくほどではありません。 –

答えて

2

あなたはいつもaからbに均等に分布する乱数の範囲で移動して、このような値にあなたの状態を確認することができます。

if((rand() % 100)>=75) 
    // 25% 
    ; 
else 
    // 75 % 
    ; 
2

ランド()だから、半分の値は1/3が0とRAND_MAX/3と2の間となり、0からRAND_MAX/2の間になるあなたに0とRAND_MAX(典型的な32K)

の間の乱数を与えます/ 3はRAND_MAX/3とRAND_MAXの間になります。

ヒントは十分ですか?

3

<random>ライブラリを使用してください。 bernoulli_distributionは、ある確率pで真を生成し、確率1-pで偽を生成する。

#include <random> 

#include <iostream> 
#include <algorithm> 
#include <iterator> 

int main() { 
    std::generate_n(std::ostream_iterator<bool>(std::cout," "), 10, 
        std::bind(std::bernoulli_distribution(0.25), std::mt19937())); 
} 

プリント:

1 0 0 1 0 0 1 0 0 0