2

私はプロジェクトに取り組んでおり、立ち往生しています。乱数を生成する変数が 2 つあります。変数が同じ数でないことを確認するチェックを行いたいのですが、そうである場合は、同じでなくなるまでプロセスを繰り返します。これが私が持っているものです:

num_enemy = 3;

int f =  rand() % num_enemy;
int m =  rand() % num_enemy;

if ( f != m )
{
enemy_ptr[f] -> fire_Weapon();
enemy_ptr[m] -> update_Status();
}

上記のコードは機能しません。さらに、false の場合に乱数を再度生成するようにするにはどうすればよいですか?

私は答えを探しているのではなく、正確に何をする必要があるかについての支援を求めています。ありがとう!

4

6 に答える 6

1

ある条件で何かを繰り返したい場合、必要なのはループ、つまり繰り返しのために作られた構造です。この場合、条件をチェックする前に少なくとも 1 回実行する必要があるため、do-while ループをお勧めします。

 int f, m;
 do {
   f = rand() % num_enemy;
   m = rand() % num_enemy;
 } while(f == m);

 enemy_ptr[f] -> fire_Weapon();
 enemy_ptr[m] -> update_Status();
于 2013-05-15T05:20:08.900 に答える
0
num_enemy = 3;

int f =  rand() % num_enemy;
int m =  rand() % (num_enemy-1);
m += (m>=f);

enemy_ptr[f] -> fire_Weapon();
enemy_ptr[m] -> update_Status();

考えられるのは、f得られる数値は の可能な値のセットから取り出されるということですm。の可能なセットから値が削除されたので、を使用してmの可能な値の数を減らし、選択された値が可能な値の 1 つになるように調整します。つまり、 が で選択した値以上の場合は、1 を追加します。これは、ブール値が 0 または 1 に変換されるため、'巧妙に' と書かれています。m% (num_enemy-1)mmfm += (m>=f);

また、rand()通常は適切な乱数ジェネレーターではなく、mod を使用しても、希望する範囲で均一な分布を生成するのに適していません。C++11<random>ライブラリを使用する必要があります。

#include <random>

int num_enemy = 3;

// set up decent random number engine and distributions
std::mt19937 eng;
std::uniform_int_distribution<> f_dist{0, num_enemy-1};
std::uniform_int_distribution<> m_dist{0, num_enemy-2};

int f = f_dist(eng);
int m = m_dist(eng);
m += (m>=f);
于 2013-05-15T07:11:03.770 に答える