4

0 から 5 までの範囲で乱数を生成したいのですが、たとえば 3 は必要なく、0、1、2、4、5 だけが必要な場合があります。範囲内で乱数を生成するにはどうすればよいですか?しかし、必要のない数字を除外するオプションがあります。

4

6 に答える 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 に答える