百分比统计困境

时间:2015-01-03 15:36:42

标签: percentage percentile

我们说我有12个值。对于这种情况,让每个值为一年中的一个月。现在每个月用自己独立的纸张写下来并放在桌子上。

因此,我们在一张桌子的表面上连续放了12张纸,每张纸上写着一年中的一个月。

每个月都会分配一定的百分比来选择。例如,1月= 15%,2月= 9%,12月= 5%等等。

现在,让我们随机选择1到100之间的数字。我们可以使用两个10面模具,使用计算机随机数生成器,或任何你想要的。

好的,让我们看一下那张" 1月"的那张纸。我们现在生成一个介于1和100之间的随机数,然后滚动到43个。好吧,我们现在进入二月,因为我们正在寻找一个或更低的15。看看2月份,我们会生成一个介于1到100之间的新随机数,然后滚动87.同样,我们正在寻找9或更低的选择2月,所以我们进入3月。等等......直到7月,我们得到的随机数为3!好的,7月被选中,我们停止整个过程。 7月是赢家。

我的问题是:每个月是否确实有被选中的百分比值?因为我们停止处理剩下的几个月,如果有人被选中,我想不会。如果我们每个月处理一次而不管被选中哪一个,那么是的,每个月都会有它的面值百分比值被选中的机会。

如果我们必须每月选择一次绝对停止(我们必须这样做),我怎样才能让每个月都有被选中的真实百分比?

我认为这个过程的一个步骤是确保每个月都有一个值,如果所有加在一起将等于100,我已经完成了。但这真的能确保一切吗?

Code wise(c ++),这里的内容如下:

// 15% January
// 9%  February
// 9%  March
// 8%  April
// 8%  May
// 8%  June
// 8%  July
// 8%  August
// 8%  September
// 8%  October
// 6%  November
// 5%  December

int month = 0;
bool monthFound = false;

if (!monthFound && random(1, 100) <= 15)
{
    monthFound = true;
    month = 1;
}

if (!monthFound && random(1, 100) <= 9)
{
    monthFound = true;
    month = 2;
}

if (!monthFound && random(1, 100) <= 9)
{
    monthFound = true;
    month = 3;
}

if (!monthFound && random(1, 100) <= 8)
{
    monthFound = true;
    month = 4;
}

if (!monthFound && random(1, 100) <= 8)
{
    monthFound = true;
    month = 5;
}

if (!monthFound && random(1, 100) <= 8)
{
    monthFound = true;
    month = 6;
}

if (!monthFound && random(1, 100) <= 8)
{
    monthFound = true;
    month = 7;
}

if (!monthFound && random(1, 100) <= 8)
{
    monthFound = true;
    month = 8;
}

if (!monthFound && random(1, 100) <= 8)
{
    monthFound = true;
    month = 9;
}

if (!monthFound && random(1, 100) <= 8)
{
    monthFound = true;
    month = 10;
}

if (!monthFound && random(1, 100) <= 6)
{
    monthFound = true;
    month = 11;
}

if (!monthFound && random(1, 100) <= 5)
{
    monthFound = true;
    month = 12;
}

if (month)
    printf("The month that was picked is: %d", month);
else
    printf("No month was picked.");

这是另一种方式:

int monthNum = 0;
std::vector<int> chance_;
std::vector<int> month_;

month_.push_back(1);      chance_.push_back(15);
month_.push_back(2);      chance_.push_back(9);
month_.push_back(3);      chance_.push_back(9);
month_.push_back(4);      chance_.push_back(8);
month_.push_back(5);      chance_.push_back(8);
month_.push_back(6);      chance_.push_back(8);
month_.push_back(7);      chance_.push_back(8);
month_.push_back(8);      chance_.push_back(8);
month_.push_back(9);      chance_.push_back(8);
month_.push_back(10);     chance_.push_back(8);
month_.push_back(11);     chance_.push_back(6);
month_.push_back(12);     chance_.push_back(5);

for (std::vector<std::string>::size_type z = 0; z < month_.size(); z++)
{
    // Check the chance of the month being picked.
    if (RANDOM(1, 100) <= chance_[z])
    {
        monthNum = month_[z];
        break;
    }
}

if (monthNum)
    printf("The month that was picked is: %d", monthNum);
else
    printf("No month was picked.");

1 个答案:

答案 0 :(得分:0)

你没有标记C++,我使用python,所以这是Kris的建议:python:

import random
number = random.randint(1,100)

if number >= 95:
    print ('December')

elif number >= 89:
    print ('November')

elif number >= 81:
    print ('October')

elif number >= 73:
    print ('September')

elif number >= 65:
    print ('August')

elif number >= 57:
    print ('July')

elif number >= 49:
    print ('June')

elif number >= 41:
    print ('May')

elif number >= 33:
    print ('April')

elif number >= 27:
    print ('March')

elif number >= 16:
    print ('Febuary')

elif number >= 1:
    print ('January')