V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
leeneo
V2EX  ›  问与答

C#伪随机抽奖系统出来的结果不符合概率,求解。

  •  
  •   leeneo · 2020-04-08 15:24:39 +08:00 · 1589 次点击
    这是一个创建于 1716 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我想做一个伪随机的抽奖系统,抽不中概率会慢慢增加。思路大概是这样:中奖概率 X%——就在 1~100 中随机抽取 X 个数当“中奖号码池”,然后再随机抽取一个数进行比对,在其中就视为中奖,不中就抽取 N(不中的抽奖次数+1)倍 X 的数量放进“中奖号码池”,然后再抽取一个数字进行比对,直到中奖 就使 N=0 。
    结果就是中奖概率偏高,比如 3%的中奖概率,结果有将近 10%的中奖数(一万次抽奖)。
    我创造伪随机数用的是 RNGCryptoServiceProvider() 。
    9 条回复    2020-04-08 21:43:06 +08:00
    sun1991
        1
    sun1991  
       2020-04-08 15:55:47 +08:00
    看不懂 LZ 描述. 试试关键字: weighted random
    shintendo
        2
    shintendo  
       2020-04-08 16:00:08 +08:00
    看不懂描述+1
    你说的偏高是相对什么偏高?你不是抽不中会加概率吗?
    leeneo
        3
    leeneo  
    OP
       2020-04-08 16:37:40 +08:00
    @shintendo 抽不中会加增加概率,但是大数量下的测试结果和预定概率有偏差(偏高)。
    leeneo
        4
    leeneo  
    OP
       2020-04-08 16:43:14 +08:00
    @sun1991 简单的来说就是,抽奖不中就不断扩大中奖号码池以达到中奖概率增加的效果,但是在测试之后发现实际中奖概率偏高,3%的设定中奖概率,结果有将近 10%的中奖概率(一万次抽奖一千多的中奖次数)。
    leeneo
        5
    leeneo  
    OP
       2020-04-08 16:47:40 +08:00
    中奖概率 X% 多次不中
    抽奖次数 1:号码池数量 X
    抽奖次数 2:号码池数量 X*2
    抽取次数 3:号码池数量 X*3
    N: X*N
    kop1989
        6
    kop1989  
       2020-04-08 16:51:39 +08:00
    这不是很正常么,因为你的中奖概率在提高啊,你设定的 3%是首次中奖概率
    @leeneo
    kop1989
        7
    kop1989  
       2020-04-08 16:53:03 +08:00   ❤️ 1
    你第一天吃一个馒头,没吃饱的话第二天吃两个,还没饱第三天吃三个,然后你问 7 个馒头为何 3 天就吃完了?
    leeneo
        8
    leeneo  
    OP
       2020-04-08 18:06:23 +08:00
    @kop1989 看来是我对伪随机的理解错了。 请问那伪随机应该是如何设计呢?
    sun1991
        9
    sun1991  
       2020-04-08 21:43:06 +08:00
    @leeneo 感觉类似 BJ 车牌摇号的规则, 一次抽不中就下次就会增加抽中的概率? 那样的话应该增加权重啊. 关键字 weighted random.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5280 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:16 · PVG 16:16 · LAX 00:16 · JFK 03:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.