0

我正在制作游戏,我需要使用随机数生成器。我需要它从数组中取出一些东西,并且需要数组中的东西有不同的概率从数组中被挑选出来。这是我的代码(注意:号码被选中的机会随着每个号码而下降)

int randomInt(int lower, int upper) 
{ 
    int num;
    int s; 
    for (s = 0; s < 1; s++)
    { 
        num = (rand() % 
           (upper - lower + 1)) + lower; 
    }
    return num; 
} 


const char *yes[5] {"one", "two", "three", "four", "five"};
4

1 回答 1

1

为了实现这一点,您还应该创建一个数组来定义每个元素被选中的概率。例如,您可以使用数组{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]);
}
于 2021-02-20T00:15:12.737 回答