我试图用蒙特卡罗方法来评估一个统计问题。在这个问题中,我生成一个随机数,并将其与存储在一个名为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;
}
}发布于 2016-11-04 01:45:41
如果我正确地理解了您,您希望确保comms_reliability的所有元素都满足某些条件(即小于rang())。
因此,对所有元素进行循环并对每个元素进行测试,或者只使用std::all_of
// 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;
}
}与lambda函数不同,您还可以使用以前在某个地方定义的普通函数:
bool is_reliable(float r) {
return rang() > r;
}注意:尝试改进变量/函数的命名。
发布于 2016-11-04 01:54:26
使用标志保留值
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;
}https://stackoverflow.com/questions/40413984
复制相似问题