我试图通过蒙特卡罗方法评估统计问题。在这个问题中,我生成一个随机数,并将其与存储在标题为comms_reliability
的向量数组中的固定概率数进行比较。假设向量数组中只有一个变量,我将比较随机数和概率,并在随机数大于可靠性数的情况下计算结果。但是,向量数组也可能有两个值,在这种情况下,我生成两个随机数,并将它们与两个可靠性数字进行比较。如果两个随机数都大于可靠性数字,我就会计算这些情景。从理论上讲,这可以在矢量数组中继续使用,并且可以继续使用。然而,由于想象力的失败,我只知道如何编写这个,其中for语句包含在多个if语句中
对于每种可能的情况。在这个实现中,我必须多次复制相同的代码行,并且它还限制了可以根据我复制这些代码行来处理下一个数组点的次数来评估的commms_reliability
数组大小。我怎么能这样做只需要一个if语句。我目前如何编码的示例如下所示。
int main(int argc, const char * argv[]) {
int sample_size = 1000000;
std::vector<float> comms_reliability = {0.6,0.6};
float tally = 0.0;
// rang() = random number generator
// if statement for comms_reliability array of size 1
if (comms_reliability.size() == 1) {
for (int i = 0; i < sample_size; i++){
if (rang() > comms_reliability[0]) tally = tally + 1.0;
}
}
// if statement 2 for comms_reliability array of size 2
if (comms_reliability.size() == 2) {
for (int i = 0; i < sample_size; i++){
if (rang() > comms_reliability[0] && rang() > comms_reliability[1]) tally = tally + 1.0;
}
}
// if statement 3 for comms_reliability array of size 3
if (comms_reliability.size() == 3) {
for (int i = 0; i < sample_size; i++){
if (rang() > comms_reliability[0] && rang() > comms_reliability[1] &&
rang() > comms_reliability[2]) tally = tally + 1.0;
}
}
答案 0 :(得分:2)
如果我理解正确,您希望确保rang()
的所有元素都满足每个样本的某些标准(即小于// Lambda function used to test a single comm_reliability
auto is_reliable = [] (float r) { return rang() > r; };
// Iterate over your samples
for (int i = 0; i < sample_size; ++i) {
// If all elements satisfy your criterion ...
if (std::all_of(std::begin(comms_reliability),
std::end(comms_reliability),
is_reliable)) {
// .. perform your action
tally += 1.0;
}
}
)。
因此,对所有元素进行循环并测试每个元素,或者只使用std::all_of
:
bool is_reliable(float r) {
return rang() > r;
}
除了lambda函数之外,您还可以使用之前定义的普通函数:
obj.desc
注意:尝试改进变量/函数命名。
答案 1 :(得分:0)
使用标志来保持值
int main(int argc, const char * argv[]) {
int sample_size = 1000000;
std::vector<float> comms_reliability = {0.6,0.6};
float tally = 0.0;
// rang() = random number generator
for (int i = 0; i < sample_size; i++){
boolean flag = true;
for(int j = 0; j < comms_reliability.size(); j++)
{
if (rang() <= comms_reliability[j])
{
flag = false;
break;
}
}
tally = flag ? tally + 1.0 : tally;
}