我必须以c * b的形式编写一段代码,其中c和b是随机数,乘积小于INT_MAx。但是b或c必须等于0 10%的时间,我不知道该怎么做。
srand ( time(NULL) );
int product = b*c;
c = rand() % 10000;
b = rand() % INT_MAX/c;
b*c < INT_MAX;
cout<<""<<endl;
cout << "What is " << c << "x" << b << "?"<<endl;
cin >> guess;
答案 0 :(得分:4)
您可以使用std::piecewise_constant_distribution
std::random_device rd;
std::mt19937 gen(rd());
double interval[] = {0, 0, 1, Max};
double weights[] = { .10, 0, .9};
std::piecewise_constant_distribution<> dist(std::begin(interval),
std::end(interval),
weights);
dist(gen);
答案 1 :(得分:1)
int始终小于或等于INT_MAX,因此您可以简单地用两个均匀分布的整数的乘积乘以90%的概率将真布尔型变量相乘:
std::random_device rd;
std::mt19937 generator(rd());
std::uniform_int_distribution<int> uniform;
std::bernoulli_distribution bernoulli(0.9); // 90% 1 ; 10% 0
const int product = bernoulli(generator) * uniform(generator) * uniform(generator)
如果您有特定的限制,例如对单个数字说N,对两个数字的乘积说M,则可以执行以下操作:
std::default_random_engine generator;
std::uniform_int_distribution<int> uniform(0,N);
std::bernoulli_distribution bernoulli(0.9); // 90% 1 ; 10% 0
int product;
do { product = bernoulli(generator) * uniform(generator) * uniform(generator) }
while(!(product<M));
编辑:std :: piecewise_constant_distribution更优雅,直到我读完另一个答案才知道。
答案 2 :(得分:0)
如果您想要一个不依赖于标准C ++库的可移植解决方案,并且该解决方案更快,更容易理解,则可以使用以下代码段。变量random_sequence
是预先生成的随机数数组,其中0发生在10%的时间。变量runs
和len
用于以无穷序列索引到此数组。但是,这是一个简单的解决方案,因为模式将在运行90次后重复。但是,如果您不关心重复模式,则此方法会很好用。
int runs = 0;
int len = 90; //The length of the random sequence.
int random_sequence[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int coefficient = random_sequence[runs % len];
runs++;
然后,无论您希望变量为0还是10%的时间都像这样:
float b = coefficient * rand();
或
float c = coefficient * rand();
如果您希望两个变量的次数分别为0 10%,则如下所示:
float b = coefficient * rand();
coefficient = random_sequence[runs % len];
float c = coefficient * rand();
如果您希望它们在10%的时间内共同为0,那么random_sequence
数组必须像这样:
int len = 80;
int random_sequence[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
并使用
float b = coefficient * rand();
float c = coefficient * rand();
答案 3 :(得分:0)
我在这里给了他一个镜头@ [http://codepad.org/DLbVfNVQ]。平均值在0.4左右。 -CR