为了实现这一点,您还应该创建一个数组来定义每个元素被选中的概率。例如,您可以使用数组{0.25, 0.4, 0.1, 0.05, 0.2}。确保总概率为 1。现在,我们生成一个介于 0 和 1 之间的随机浮点数。如果数字落在 之间[0, 0.25],那么我们选择第一个元素。如果元素介于 之间[0.25, 0.65],我们选择第二个元素。每次间隔正好是您定义的概率数组中元素的大小。通过这种方式,我们确保每个元素都具有您在数组中定义的准确被选中的概率。
下面的函数random_element_index正是完成了这一点:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define LENGTH 5
int random_element_index(float* probs) {
// This line generates a random float between 0 and 1
float random = (float)rand() / (float)RAND_MAX;
float sum = 0;
for (int i = 0; i < LENGTH; i++) {
sum += probs[i];
if (random < sum)
return i;
}
return -1;
}
int main() {
srand(time(NULL));
const char *yes[LENGTH] = {"one", "two", "three", "four", "five"};
float probabilities[LENGTH] = {0.25, 0.4, 0.1, 0.05, 0.2};
int index = random_element_index(probabilities);
printf("%s\n", yes[index]);
return 0;
}
如果您不相信,可以使用以下函数来查看它的实际效果:
void test_random() {
float probabilities[LENGTH] = {0.25, 0.4, 0.1, 0.05, 0.2};
int test[LENGTH] = {0, 0, 0, 0, 0};
for (int i = 0; i < 10000; i++)
test[random_element_index(probabilities)]++;
for (int i = 0; i < LENGTH; i++)
printf("%d\n", test[i]);
}