Поскольку rand()
дает вам значение от 0
до RAND_MAX
, вы можете получить значение в определенном процентном соотношении, просто выбрав соответствующий порог.Например, если RAND_MAX
было 999
, то ожидается, что 42% всех значений будет меньше 420
.
. Таким образом, вы можете использовать код, как в следующей полной программе, для настройкисоответствующий порог и протестируйте распределение ваших значений:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int main(int argc, char *argv[]) {
// Get threshold (defaults to ~PI%), seed random numbers.
double percent = (argc > 1) ? atof(argv[1]) : .0314159;
int threshold = round(RAND_MAX * percent);
srand(time(0));
// Work out distribution (millions of samples).
int below = 0, total = 0;
for (int i = 0 ; i < 1000000; ++i) {
++total;
if (rand() < threshold) ++below;
}
// Output stats.
printf("Using probability of %f, below was %d / %d, %f%%\n",
percent, below, total, below * 100.0 / total);
}
Некоторые примеры проб с различными желаемыми вероятностями:
Using probability of 0.031416, below was 31276 / 1000000, 3.127600%
Using probability of 0.031416, below was 31521 / 1000000, 3.152100%
Using probability of 0.421230, below was 420936 / 1000000, 42.093600%
Using probability of 0.421230, below was 421634 / 1000000, 42.163400%
Using probability of 0.175550, below was 175441 / 1000000, 17.544100%
Using probability of 0.175550, below was 176031 / 1000000, 17.603100%
Using probability of 0.980000, below was 979851 / 1000000, 97.985100%
Using probability of 0.980000, below was 980032 / 1000000, 98.003200%
Using probability of 0.000000, below was 0 / 1000000, 0.000000%
Using probability of 1.000000, below was 1000000 / 1000000, 100.000000%
Итак, суть в том, чтобы:Если вы хотите иметь вероятность p
(значение double
) и ноль с вероятностью 1 - p
, вам необходимо следующее:
srand(time(0)); // done once, seed generator.
int threshold = round(RAND_MAX * p); // done once.
int oneOrZero = (rand() < threshold) ? 1 : 0; // done for each cell.
Просто имейте в виду пределы rand()
, разница между (например) вероятностями 0.0000000000
и 0.0000000001
, скорее всего, не будет существовать, если RAND_MAX
не достаточно велико, чтобы иметь значение.Я сомневаюсь, что вы будете использовать такие вероятности, но я подумал, что лучше упомянуть об этом на всякий случай.