我不明白你的顾虑是什么.
这根本就不用设计.
每个卡的概率就是这个卡/所有的卡
实际上就是牌堆里随机取牌,不放回的随机取.
如果用Python的话可以直接使用random.choice()方法从所有的牌中选取一张,然后从牌堆里去掉这张牌.牌堆取空结束.
假如牌堆非常大,组成列表不合适的话,也有很大的优化空间.
这种问题建议先把需求转换成数学问题,其实根本没什么算法,只要保证好随机就行了.
update:
肯定要设计啊,这一实现会出现概率大的先被抽取,然后稀缺的就是概率小的随着卡片总数的减少会出现稀缺概率增大的问题。就会造成越到后面或得稀缺的几率就越大
题主的这条回复虽然不太严谨,但是我能理解.
我之前提到的是真随机算法(认为随机选取是真随机的情况下).在这种情况下,并不会出现题主描述的"先出现大概率的,越往后抽取到稀缺的概率越大"这种情况.这个其实是一个简单的概率论问题,没必要展开讨论.
但是真随机的结果在小样本下可能会出现很大的出入,比如说我们玩手游十连抽,一张卡出现的概率宣称是10%,我们可能几个10连都抽不到(90%^10=34.8%,十连不出的概率是34%,两次十连不出的概率也就是10%左右,三次就是3%,四次1%,100个人里就会出现一个,这个比例还是挺高的),也可能一个十连出5个.
所以很多时候我们都选择使用伪随机.比如游戏里的抽卡暴击等等,绝大多数游戏里的随机都是伪随机.
伪随机就是通过人为的调节,使样本量比较小时,整体结果依然符合数学期望.比如十连抽必出稀有.
一个极端就是纯伪随机,卡片出现的顺序手工设定,下一张卡完全可预测.另一个极端当然是真随机,在这个区间内选择一个合适的度进行伪随机.最简单的方法是将样本均匀等分成N等份.比如整体是100A,10B,分成10份就是每份10A1B,这样最多10张A就会出现一张B,同时保证稀有的B不会连续出现.分成多少份就是所谓的度.
具体应该有一些文章,随便说说自己的看法,并没有查询什么资料,如有谬误见笑