2013-04-14 80 views
-1

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

数组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; 
} 

这是一个非工作计划的一部分,但我怀疑问题出在这部分代码。它有什么问题吗?无论如何更有效地编写代码?

+0

“问题出在这部分代码上”。什么问题? –

+0

退房'' –

+0

请不要继续编辑代码。确保你已经发布了你正在编译的代码。问题是什么?你有错误吗?如果是这样,那是什么? –

回答

3

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

好像你有几个问题。首先,你应该创建一个随机数高达18,而不是数组的大小:

int i = rand() % 18; 

请注意,这并不一定按照均匀分布给你i(仅当会是RAND_MAX 18的倍数)。

此外,您在循环c多达8个,而不是供它应该是5:

while(c < 5){ 

否则,你正在访问的array范围之外。

你也可以在这条线FULLWIDTH SEMICOLON Unicode字符(U + FF1B):

sum += array[c]; 
//   ^

你从一个文档复制它,也许?确保它是一个正常的SEMICOLON字符(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)

+0

我编辑了我的问题以反映您指出的内容。我看“c”达到8,因为这次我们有8个选择,因此array [0] -array [7]包含我8个选择的概率数字。另外我刚刚开始学习C++,所以我不熟悉你的第二个建议,特别是格式。 – kir

+0

@ user2280704那么问题是什么?你还没有告诉我们。如果您发现错误,请告诉我们它是什么。如果它不符合你的期望,请告诉我们它在做什么。 –

+0

我的问题是我在调试我的程序时遇到了问题。这段代码只是我程序的一小部分,我想知道这段代码是否有问题。基本上我的主要问题是我不确定如何在我的程序中实现概率概念,并且我要求澄清我是否正确地做了这件事。 – kir

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; 
} 

您错过了那里的分号。

0

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

+0

是的,我只是这样做,发现我的程序的这部分工作。谢谢。 – kir