找回密码
 点一下
查看: 2043|回复: 12

如何做到随机不重复的在出生点生成单位?

[复制链接]
发表于 2018-12-8 01:40:15 | 显示全部楼层 |阅读模式
我想在10个出生点中随机为10位玩家生成1个单位,并且每个点只有一名玩家的单位,但是直接用“随机整数”的话,重复在一个点生成的概率很高。
我也想了一些办法,比如在确定一个随机数时,先让它和之前生成的数做对比,如果重复就再随机。但是我触发器水平不够,逻辑稍微复杂就乱了,没有办法实现想要的效果。同时我也在论坛里找了一下,也有前辈回答过类似的问题,比如a和b交换位置并重复多次直到打乱顺序,也就是洗牌的原理,但我实在是没看懂这个操作是怎么在触发器里写的。我也在论坛里找到了一张演示扑克牌的地图“演示扑克牌系统
http://bbs.islga.org/forum.php?m ... &fromuid=154540
(出处: GA地精研究院)
”,但还是看不懂。

好像随机不重复这个操作挺难的,请问有没有大佬愿意教导我一下如何实现这个功能?
发表于 2018-12-8 05:04:02 来自手机 | 显示全部楼层
遇到弄迷糊情况建议先整理自己的思路,理清逻辑思维。
我的方法:定义变量数组1到10,将其全部加入一个组,它们会有对应在该组中的位置序号,随机整数1到10,将序号为随机数的变量移出组并赋给玩家1,此时组中变量所对应的序号改变(即序号比其大的全部减1),依次类推,玩家2,取出序号为随机整数1到9,总共10次。可以使用变量加循环来简化编写:为每个1到10的整数a执行动作:「将在组中序号为(随机整数1到11-a)的变量移出组并赋给玩家a」

点评

感谢大佬,问题已解决!  详情 回复 发表于 2018-12-8 16:05
这种非对象的调用方式就会比较蛋疼啊,写起来要麻烦死了  发表于 2018-12-8 09:15
洗扑克牌的这个方法对于多个玩家不共享有点麻烦  发表于 2018-12-8 09:12
回复

使用道具 举报

发表于 2018-12-8 10:22:11 | 显示全部楼层
屏幕截图(18).png
这个就是洗牌的方式创建随机单位。如果不想重复可以加大这个单位组的单位类型,超过玩家组的数量就可以保证不重复。
按照我目前10个玩家创建单位,类型5个的话,有两个玩家肯定会重复的。

至于如果你只是想点不一样,单位允许重复,就是玩家组初始化完,挑选每个,然后单位组随机就行,不用移动单位组数据指针。

点评

感谢大佬,问题已解决!  详情 回复 发表于 2018-12-8 16:06
回复

使用道具 举报

发表于 2018-12-8 10:38:16 | 显示全部楼层
屏幕截图(20).png
这个就是简单的在不同玩家的出生点创建随机单位。但是单位是会重复的。

如果想单位也不重复,参见我二楼的例子,里边的出生点也设置成数组,就行了。

BTW,这个你不能指望所有人都会写示例,毕竟很费时间没什么意义。顶多说说思路。
回复

使用道具 举报

发表于 2018-12-8 10:50:10 | 显示全部楼层
正好有时间就多说点。比如随机对战这个图,他其实也是这么来生成单位的,只不过点定位到建造位置,单位类型有层级划分,大概就是把单位定义成  普通 高级 稀有 英雄 BOSS 5个等级,每个等级里边有该等级的单位类型组。
简单做个2维数组,第一个下标表示单位的等级,第二个表示单位的类型。
单位类型数组[随机数(等级)][随机数(类型)],这样就行了。

如果给单位的等级增加概率
else if (随机数1-100) > 10
变量等级 = 普通(0)
else if (随机数1-100) > 5
变量等级 = 高级(0)

创建单位 单位类型数组[变量等级][随机数(类型)]

这里边就是90%的几率是普通单位,5%的几率是高级单位,其他的以此类推。

更复杂点就是比如我希望100个单位一定有90个是普通,5个是高级这种平均分布的随机单位创建。这个等级的随机数就需要用洗牌的方式来实现。
回复

使用道具 举报

发表于 2018-12-8 13:32:08 | 显示全部楼层
一般来说就这几个步骤
1初始化数组的元素以及数组大小s
2随机选中数组中的元素从1到s,索引为r
3记录元素[r]
4把元素[s]写到[r]处,s=s-1

点评

感谢大佬,问题已解决!  详情 回复 发表于 2018-12-8 16:07
回复

使用道具 举报

 楼主| 发表于 2018-12-8 16:04:57 | 显示全部楼层
感谢各位前辈的指导,我仔细研究了一下花时雨大佬的截图,发现我是因为不知道如何将选出来的随机数排除掉,所以没办法把这个操作完成。现在我已经掌握了我需要的部分,也就是给玩家分配随机不重复的出生点。
我顺便把这一部分单独拿出来保存为地图,如果以后有人需要也许可以帮得上忙。

随机不重复演示.SC2Map

17.59 KB, 下载次数: 6

回复

使用道具 举报

 楼主| 发表于 2018-12-8 16:05:39 | 显示全部楼层
超级007x 发表于 2018-12-8 05:04
遇到弄迷糊情况建议先整理自己的思路,理清逻辑思维。
我的方法:定义变量数组1到10,将其全部加入一个组, ...

感谢大佬,问题已解决!
回复

使用道具 举报

 楼主| 发表于 2018-12-8 16:06:28 | 显示全部楼层
花时雨 发表于 2018-12-8 10:22
这个就是洗牌的方式创建随机单位。如果不想重复可以加大这个单位组的单位类型,超过玩家组的数量就可以保 ...

感谢大佬,问题已解决!
回复

使用道具 举报

 楼主| 发表于 2018-12-8 16:07:33 | 显示全部楼层
priceles 发表于 2018-12-8 13:32
一般来说就这几个步骤
1初始化数组的元素以及数组大小s
2随机选中数组中的元素从1到s,索引为r

感谢大佬,问题已解决!
回复

使用道具 举报

发表于 2018-12-8 16:51:31 来自手机 | 显示全部楼层
如果要很多次用到不重复随机,其实可以自己写函数,输入随机的范围与整数变量组,运行后使变量组中的每个变量等于随机范围中的一个数(不重复),依情况可以还可以写几种不同类型输入和输出。二维只需使用两次该函数即可,并且你可以把函数放入库中并导出保存,在你的其他地图中也能用到(我直接写10与16进制互转函数就是这么干的)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-24 11:02 , Processed in 0.053718 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表