-1

我有一个包含不同选择概率的数组。例如:

数组 1 具有 {5, 3, 2, 7, 1} 值。选项“0”有 5/18 的机会被选中,选项“1”有 3/18 的机会……以此类推。“18”是数组值的总和。

这是我的代码(在这种情况下,我们有 8 个选择):

int i = rand() % sumofvaluesofarray; //edited from array_size
int c = 0;
int sum = 0;
while(c < 8){
    sum += array[c];
    if(i < sum){
        choice = c;
        break;
    }
    c += 1;
}

这都是非工作程序的一部分,但是我怀疑问题出在这部分代码上。有什么问题吗?有没有更有效地编写这段代码?

4

3 回答 3

3

提问者不断更改他们的代码。请注意未来的提问者:请在编译时准确发布您的代码。

好像你有几个问题。首先,您应该创建一个18不超过数组大小的随机数:

int i = rand() % 18;

请注意,这并不一定会i根据均匀分布给您(仅当它RAND_MAX是 18 的倍数时才会给您)。

此外,您c最多循环 8 个,而应该是 5 个:

while(c < 5){

否则,您将访问array.

此行中还有一个全宽分号 unicode 字符 (U+FF1B):

sum += array[c];
//             ^

您是从文档中复制的吗?确保它是一个普通的分号字符 (U+003B)。

如果您使用的是 C++11 编译器,则可以停止关心如何有效地编写它,而只需使用<random>标头:

std::random_device rd;
std::mt19937 gen(rd());
std::discrete_distribution<> d(std::begin(array), std::end(array));

有了这个,您可以通过调用根据离散分布生成随机值d(gen)

于 2013-04-14T23:10:09.807 回答
2
int i = rand() % size_array;
int c = 0;
int sum = 0;
while(c < 8){
    sum += array[c];    // Missing semicolon
    if(i < sum){
    choice = c;
    break;
    }
    c += 1;
}

你错过了一个分号。

于 2013-04-14T23:08:19.157 回答
0

如果您想知道代码中的算法是否正常工作,请将其写入函数并为其创建单元测试。通过这种方式,您可以为函数提供一组预定的参数,这些参数可以与预期结果进行比较。现在,当您进入调试会话时,您可以合理地假设该功能正常工作,然后您可以专注于代码的其他区域。

于 2013-04-14T23:57:23.260 回答