Deek
2020-08-13T07:36:53+00:00
原需求为:
一等奖概率是32/10000,二等奖概率是400/10000.三等奖概率是1666/10000.
库存是一等奖32个,二等奖400个,三等奖1666个。
原实现为x = rand() % 10000
if x < 32, 则从一等奖库存中取奖品,如果取不到则依次遍历二、三等奖库存去取。
else if x < (400 + 32), 则从二等奖库存中取奖品,如果取不到则从三等奖库存中取。
else if x < (1666 + 400 + 32),则从三等奖库存中取奖品。
原贴中没有提到退出条件,合理的假定是所有奖品库存耗尽后,活动结束。
乍一看,当一等奖耗尽时,二等奖的获奖概率会是4.32%.
而当一、二等奖耗尽时,三等奖的获奖概率会是20.98%。
这明显不符合需求呀。
那咱们就用代码跑一下,给出真凭实据的数据来。
因此写了代码模拟抽奖10000次,统计各个奖品的耗尽情况:
10000 times draw simulate, average draw times for all prize to run out is 10788
10000 times draw simulate, average draw times for 3rd prize to run out is 9990
10000 times draw simulate, average draw times for 2nd prize to run out is 9878
10000 times draw simulate, average draw times for 1st prize to run out is 10089
嗯,各个等级的奖品都是差不多在接近1W次的抽奖中被抽光,代码的结果居然非常接近需求?
因此我们回过头来看,为何逻辑上存在问题的代码竟然非常接近需求。
不合理的情况是一等奖或二等奖耗尽时,低等奖获奖的概率提高了。
这里以一、二等奖耗尽的情况为例,当出现一、二等奖耗尽时,三等奖的库存剩余情况如何呢?
同样用代码跑一下:
10000 times draw simulate, average left 3rd prize while 1st and 2nd run out is 18.430700
实际上,只有约20个三等奖享受了20.98的概率,剩余的仍然是16.66的概率(只二等奖先耗尽的情况跟这个类似,也只是小部分概率升高)
因此整体上的概率仍然与需求相近。
虽然有时候我们设计的代码存在逻辑问题,代码的结果也可能"正确",当然更多的可能是结果偏差十万八千里。
一等奖概率是32/10000,二等奖概率是400/10000.三等奖概率是1666/10000.
库存是一等奖32个,二等奖400个,三等奖1666个。
原实现为x = rand() % 10000
if x < 32, 则从一等奖库存中取奖品,如果取不到则依次遍历二、三等奖库存去取。
else if x < (400 + 32), 则从二等奖库存中取奖品,如果取不到则从三等奖库存中取。
else if x < (1666 + 400 + 32),则从三等奖库存中取奖品。
原贴中没有提到退出条件,合理的假定是所有奖品库存耗尽后,活动结束。
乍一看,当一等奖耗尽时,二等奖的获奖概率会是4.32%.
而当一、二等奖耗尽时,三等奖的获奖概率会是20.98%。
这明显不符合需求呀。
那咱们就用代码跑一下,给出真凭实据的数据来。
因此写了代码模拟抽奖10000次,统计各个奖品的耗尽情况:
10000 times draw simulate, average draw times for all prize to run out is 10788
10000 times draw simulate, average draw times for 3rd prize to run out is 9990
10000 times draw simulate, average draw times for 2nd prize to run out is 9878
10000 times draw simulate, average draw times for 1st prize to run out is 10089
嗯,各个等级的奖品都是差不多在接近1W次的抽奖中被抽光,代码的结果居然非常接近需求?
因此我们回过头来看,为何逻辑上存在问题的代码竟然非常接近需求。
不合理的情况是一等奖或二等奖耗尽时,低等奖获奖的概率提高了。
这里以一、二等奖耗尽的情况为例,当出现一、二等奖耗尽时,三等奖的库存剩余情况如何呢?
同样用代码跑一下:
10000 times draw simulate, average left 3rd prize while 1st and 2nd run out is 18.430700
实际上,只有约20个三等奖享受了20.98的概率,剩余的仍然是16.66的概率(只二等奖先耗尽的情况跟这个类似,也只是小部分概率升高)
因此整体上的概率仍然与需求相近。
虽然有时候我们设计的代码存在逻辑问题,代码的结果也可能"正确",当然更多的可能是结果偏差十万八千里。