Project1

标题: 如何实现随机抽到的数字不重复(7月31日追加问题) [打印本页]

作者: 北意大利    时间: 2020-7-18 20:53
标题: 如何实现随机抽到的数字不重复(7月31日追加问题)
本帖最后由 北意大利 于 2020-7-31 21:34 编辑


纯代码小白,知道最好的解决办法是用数组但是不会写,这里尝试着用事件脚本实现,但是喜闻乐见地报错了↓

请问有大佬知道如何解决吗?

————↓7月31日添加内容↓————

非常感谢各位大佬之前的解答!

但是实话实说这里问题并没有解决,是我标题的表述问题,这个怪我自己orz(←语文超级差)

这里正在制作的是一个学习游戏,图片这一段是想实现两个步骤:
①抽取题目:把类型+难度+题号随机  
②判断重复:形成编码,判断100-120号内有无储存相同的变量 有回到① 无则将该编码踢进100-120号中第一个值为0的变量
实现的机能是:抽取特定类型难度的题库里面的一道题,并且与之前所有抽过的题不重复

这里和一起制作的同伴讨论了一下,我们无法按照大佬们的解答解决这个问题的原因大概是:
·我们抽取的数字是有特殊的指定范围的,是三段有范围的随机数组合成一个整体形成的一串编码,而不是直接从整数范围内抽取的一列不重复的数字。

不知道有没有大佬愿意再次解答这个问题,但是真的非常感谢之前回答的老师们,这里又从中学习到了很多!
即使最终没有解决本人的问题,但是发生在本帖的讨论一定能帮到其他有着与标题有相同问题的人w
作者: Zeldashu    时间: 2020-7-18 21:37
纯代码小白,没看懂楼主写的什么意思。脚本还能这么写吗……

其实不嫌麻烦直接上变量就是了,通过数个变量挨个记录随机出来的数字,相同就继续随机,直到所有结果不曾重复。

作者: 阵颜    时间: 2020-7-18 21:43
变量1 = 随机 1..6
循环{
  变量2 = 随机 1..6
   if 变量2 != 变量 1
        跳出循环
   end
  等待1帧
}
循环{
  变量3 = 随机 1..6
   if 变量3 != 变量 1
       if 变量3 != 变量 2
          跳出循环
      end
   end
  等待1帧
}

作者: 北意大利    时间: 2020-7-18 22:34
Zeldashu 发表于 2020-7-18 21:37
纯代码小白,没看懂楼主写的什么意思。脚本还能这么写吗……

其实不嫌麻烦直接上变量就是了,通过数个变量 ...

主要是这里要判断的个数目前是二十个,量有点大……)
作者: 北意大利    时间: 2020-7-18 22:47
阵颜 发表于 2020-7-18 21:43
变量1 = 随机 1..6
循环{
  变量2 = 随机 1..6

非常感谢您!!但是这里要判断的数目是二十个,实际操作过程中是二十个触发顺序不定的事件判断是否与之前抽到过的数字重复,并不是直接随机出一组不重复的数,1L是因为为了测试有没有bug才写在一起(
作者: 北意大利    时间: 2020-7-18 22:48
阵颜 发表于 2020-7-18 21:43
变量1 = 随机 1..6
循环{
  变量2 = 随机 1..6

非常感谢您!!但是这里要判断的数目是二十个,实际操作过程中是二十个触发顺序不定的事件判断是否与之前抽到过的数字重复,并不是直接随机出一组不重复的数,1L是因为为了测试有没有bug才写在一起(
作者: 北意大利    时间: 2020-7-18 22:49
阵颜 发表于 2020-7-18 21:43
变量1 = 随机 1..6
循环{
  变量2 = 随机 1..6

非常感谢您!!但是这里要判断的数目是二十个,实际操作过程中是二十个触发顺序不定的事件判断是否与之前抽到过的数字重复,并不是直接随机出一组不重复的数,一楼那一张是为了测试有没有bug才写在一起(
作者: chyj4747    时间: 2020-7-18 23:13
报错的地方是两行“如果”,判断相等是 ==,你写的 = 是赋值
作者: fux2    时间: 2020-7-18 23:52
JAVASCRIPT 代码复制
  1. // 生成多少个数字
  2. var n = 6;
  3. // 起始变量编号
  4. var startVarId = 10;
  5. // 填充arr为1-n的数字
  6. arr = [];
  7. for(var i=0;i<n;i++) {arr.push(i+1)};
  8. // 打乱
  9. arr.sort(function(){ return 0.5 - Math.random();})
  10. // 赋值给变量
  11. for(var i=0;i<n;i++) {
  12.         $gameVariables.setValue(startVarId+i,arr[i]);
  13. };


执行以上脚本,根据需求修改n和startVarId的值
以上面的6和10为例,执行结果会变为10-15号变量变成1-6的不重复随机数

不过楼主这个报错来看,是把==写成了=
作者: 走出300加    时间: 2020-7-19 09:23
设置N个重复性检查变量
随机
随机出的数和重复性检查变量比对
不相等
随机数赋值给重复性变量

作者: yang1zhi    时间: 2020-7-19 09:56
等等。
我发现了一个新的写法
MV的事件脚本里面分开还可以继承的吗?
你前面设 var i = 0
这里是一个脚本。
下面 i = ++1
又是一段脚本。
i = ++1也是我没接触过的写法。
长知识了。
作者: 怕鼠的猫    时间: 2020-7-19 10:07
  1. a=[3,5,7,9]
  2. list=a.shuffle
复制代码


在Ruby里面,数组内置 shuffle 方法,功能是打乱排序。  可以实现不重复的随机。
作者: PLeaseS    时间: 2020-7-19 12:38
没有思路

随机抽取变量1-6
第一次抽取变量=1

第二次随机抽取变量,抽到1的话再抽一次
直到不是一为止
作者: apporoad    时间: 2020-7-19 23:29
本帖最后由 apporoad 于 2020-7-19 23:31 编辑

楼主,你的需求很简单,关键你的20个数字在哪里?
你可以直接加我qq,我直接给你免费写一个,分分钟的事情 969308614
作者: wabcmcc    时间: 2020-7-19 23:55
本帖最后由 wabcmcc 于 2020-7-20 00:18 编辑

何不直接用插件.
用於創建隨機值而無需重複的插件
HzRandomList.js

作者網誌:https://hiz-tkool.tumblr.com/

過往用事件回答差不多問題:https://rpg.blue/forum.php?mod=viewthread&tid=476708&page=1#pid2859690
                                        https://rpg.blue/forum.php?mod=viewthread&tid=412058&page=1#pid2791666
作者: 冷俊逸    时间: 2020-7-20 02:22
你有5个数,存在数组里,11 4 5 1 4
先变量1=随机1..5,然后抽出来第“变量1”个数,然后把这个数和第五个交换。比如抽出来3,数组就变成11 4 4 1 5
然后再变量1=随机1..4,再执行如上操作。这时候,因为5被放到了数组最后,所以就不会被抽到了。
这个算法好像叫扑克牌算法还是什么
作者: tseyik    时间: 2020-7-20 08:03
偽随机        
作者: apporoad    时间: 2020-7-20 08:33
本帖最后由 apporoad 于 2020-7-20 08:35 编辑
  1. var pickFromArray = function(randomNumber,existsArr , all){ return all.filter(function(one){ return existsArr.indexOf(one)==-1}).sort(function(){return Math.random() -0.5}).slice(0,randomNumber)}
复制代码


直接脚本中
pickFromArray(2, [1,2],[3,2,1,4,5,6])
作者: 北意大利    时间: 2020-7-31 21:08
yang1zhi 发表于 2020-7-19 09:56
等等。
我发现了一个新的写法
MV的事件脚本里面分开还可以继承的吗?

但是这样的写法经过修改以后还是报错 还是整体用脚本写比较保险x
作者: 阵颜    时间: 2020-7-31 23:21
本帖最后由 阵颜 于 2020-7-31 23:50 编辑

好吧,我可能还是没看懂,如果理解错了的话,那就抱歉了。
[line]2[/line]

大概看了一下,可能理解了楼主的意思,但是无法给予解答,给个思路吧。
不要踢进数值,而是踢进字符串。
比如说,A类型,a难度,编号1的题目
踢进字符串"A类型a难度编号1"。
这样就可以判断多个范围的重复的问题了。

作者: moonyoulove    时间: 2020-8-1 02:13
本帖最后由 moonyoulove 于 2020-8-1 02:38 编辑

先初始化签筒,把签筒保存全局变量或rm的变量里,
再来决定要抽取几道题目,最大值应为6*6*6(依照配置)
参数传入签筒(types),重复执行randomCode,每次都能得到随机不重复的题目编号了
JAVASCRIPT 代码复制
  1. //初始化题库的签筒
  2.       function initQuestion() {
  3.         var typeNum = 6; //类型数量
  4.         var hardNum = 6; //难度数量
  5.         var questNum = 6; //序号数量
  6.         // 建立一个多重嵌套的数组(多维阵列),如下
  7.         //类型1─难度1─序号1
  8.         //   │     └序号2
  9.         //   │     └序号3
  10.         //   └难度2─序号1
  11.         //        └序号2
  12.         var types = [];
  13.         for (var i = 0; i < typeNum; i++) {
  14.           var hards = [];
  15.           for (var j = 0; j < hardNum; j++) {
  16.             var quests = [];
  17.             for (var k = 0; k < questNum; k++) {
  18.               //存放一个对象,其里面的num代表实际序号
  19.               quests.push({
  20.                         num: k + 1
  21.                       });
  22.             }
  23.             //除了num,还得存放该难度下的序号数组
  24.             hards.push({
  25.               num: j + 1,
  26.               quests: quests,
  27.             });
  28.           }
  29.           //同理,只是改放难度数组
  30.           types.push({
  31.             num: i + 1,
  32.             hards: hards,
  33.           });
  34.         }
  35.         //全部数组建好后,返回types
  36.         return types;
  37.       }
  38.  
  39.       //抽签,原理是对建立好的签筒进行抽完不放回的动作
  40.       function randomCode(types) {
  41.                 //先抽类型,i、j、k会依序存放抽到的是第几支签
  42.         var i = rand(types.length); //表示随机types数组的到第一位到最后一位
  43.         var type = types[i]; // type实际长这样{num:第几个类型, hards:类型里的难度数组}
  44.         var hards = type.hards; //取得难度数组
  45.         var j = rand(hards.length);//第二阶段,抽难度
  46.         var hard = hards[j];
  47.         var quests = hard.quests;
  48.         var k = rand(quests.length);//第三阶段,抽题目序号
  49.         var quest = quests[k];
  50.         //已经得到一组类型、难度和序号
  51.         //实际数值是放在num里
  52.         //code可以依照需求改写,下面是用「-」连成字符串
  53.         var code = type.num + "-" + hard.num + "-" + quest.num;
  54.         //等三支签(类型、难度、序号)抽完,再进行丢掉的动作
  55.         quests[k] = quests[quests.length - 1]; //把最后一个元素覆盖到抽到的元素的位置
  56.         quests.pop();//舍弃掉最后的元素
  57.         //抽出来的序号签已经丢掉了,接下来换难度的签
  58.         //于是这里检查这个难度底下是不是还有题目,没有的话把这个难度从数组删掉
  59.         if (quests.length == 0) {
  60.                   //跟上面同样原理
  61.           hards[j] = hards[hards.length - 1];
  62.           hards.pop();
  63.         }
  64.         //再来换检查是否要从整个数组删除已经不需要的种类
  65.         if (hards.length == 0) {
  66.           types[i] = types[types.length - 1];
  67.           types.pop();
  68.         }
  69.         //最后返回处理好的编码,此处能做变通,比如返回数组,或不返回,直接赋值给rm的变量
  70.         return code;
  71.  
  72.         //内部的函数,用来方便地得到一个从0到i,但不包括i的随机整数
  73.         function rand(i) {
  74.           return Math.floor(Math.random() * i);
  75.         }
  76.       }





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1