0 から 5 までの範囲で乱数を生成したいのですが、たとえば 3 は必要なく、0、1、2、4、5 だけが必要な場合があります。範囲内で乱数を生成するにはどうすればよいですか?しかし、必要のない数字を除外するオプションがあります。
質問する
12262 次
6 に答える
2
除外したい数値はコンパイル時にわかっていますか? 次に、単純なルックアップ テーブルで次のことを行う必要があります。
static int table[] = {0, 1, 2, 4, 5};
int index = rand() % (sizeof table / sizeof *table);
int number = table[index];
もちろん、rand()
はひどい疑似乱数ジェネレーターですが、それは別のトピックです。
于 2013-02-17T10:35:57.603 に答える
0
この投稿の Java コードを使用した例を次に示します。範囲内で乱数を生成するにはどうすればよいですか? c++ に変換されます。
これはもう少し一般的で、不要なループは使用されません。
分布、範囲、発生も作成しました-このプログラムをチェックインしてください:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <time.h>
#include <map>
using namespace std;
int getRandomWithExclusion(int start, int end, vector<int> &excludes){
unsigned int max = end - start + 1 - excludes.size();
int random = start+(rand() % max);
for (unsigned int i = 0;i<excludes.size();i++) {
int ex = excludes[i];
if (random < ex){
break;
}
random++;
}
return random;
}
int main()
{
srand (time(NULL));
vector<int> excl;
map<int,int> distMap;
excl.push_back(-2);
excl.push_back(3);
for(int i=0;i<100000;i++){
int val = getRandomWithExclusion(-5,5,excl);
if (distMap.find(val) == distMap.end()){
distMap[val]=0;
}
int key = distMap[val]+1;
distMap[val]=key;
}
map<int, int>::iterator p;
for(p = distMap.begin(); p != distMap.end(); p++) {
cout << p->first <<" occurs " <<p->second << endl;
}
cout << "seems legit: even distributed and correct" << endl;
return 0;
}
于 2013-02-17T11:12:00.563 に答える
0
ループ内の 3 を破棄するだけです。
template <typename Rng>
int rand_no_three (Rng& rng)
{
std::uniform_int_distribution<> dist (0, 5);
int c;
do {
c = dist (rng);
} while (c == 3);
return c;
}
使用例:
std::mt19937 rng;
int c = rand_no_three (rng);
于 2013-02-17T10:33:42.653 に答える
0
メモリの制約がある場合に備えて、ルックアップ テーブルを使用せずにこれを行う方法を次に示します。
int map_fun(int i)
{
switch(i)
{
case 3: return 4;
case 4: return 5;
}
return i;
}
int main()
{
int i= map_fun(random_between(0, 4));
}
于 2013-02-17T10:40:51.250 に答える