如何实现从10张牌(A、B、C·······)中,随机生成3张,3张不能重复



  • 如何实现从10张牌(A、B、C·······)中,随机生成3张,3张不能重复,不能是这种AAC之类的,然后选中生成的3张中的1张,剩下的2张回到牌组里,接着重新随机生成3张,
    例如第一次生成的是A C D,选中A,下一次生成的就是在9张(B、C、D······)中选



  • @Yamls
    实现方法会有很多的,这个问题本质上是数据处理方面的问题,需要先学习数组、表达式、甚至概率组件的用法。
    简单描述一下我的快速想法:
    1.这10张牌应该使用一个固定的方式进行保存,例如数组,分别给一个编号(1-10或0-9),方便后续处理;
    2.使用概率组件或表达式(包括random()和choose(),后者需要输入十个参数才能工作,推荐前者),随机选取三个编号范围内的随机数,假设分别为x、y、z;这里的抽取方法应该使用循环,例如while循环,条件是(x=y或y=z),动作是随机选取随机数并写入局部变量(或者另一个辅助数组),这里假设抽取的三个值就被写入了xyz三个变量中。因为while循环的条件限制,如果有重复值则会重新抽取,因此可以保证三个值不相同。
    这里同样可以使用动作组来完成,动作组负责进行一次完整的随机抽取,然后动作组执行完成后检查是否有重复的,如果有则再次执行。
    3.现在只有三个值了,可以直接使用choose(x,y,z)完成三选一;这里假设抽中了x,然后遍历数组,把编号为x的牌从数组中删除。

    现在,你的需求应该已经能够完成了;后续抽取的时候同样可以重复,不过需要记得先把x、y、z复位。这里所有涉及随机的地方都可以使用概率组件代替,优点是可以设置随机种子(相同的种子带来相同的结果),缺点是事件稍微复杂一些。
    其他需要注意的:
    由于每次抽取都会从数组中删除一张卡牌,因此全部卡牌信息必须单独记录防止丢失(感觉是废话);
    while循环可能会有点问题,不好写的话用动作组就好。



  • 数组抽取删除法比较方便实用

    举个例子

    0
    1
    2
    3
    抽取随机比如 2 然后把2这条删除 剩下了
    0
    1
    3

    这里只用随机数组的长宽即可 至于是哪个看你怎么排的


登录后回复