楼主: 北意大利

[有事请教] 如何实现随机抽到的数字不重复(7月31日追加问题)

[复制链接]
梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2020-7-19 09:56:01 | 显示全部楼层
等等。
我发现了一个新的写法
MV的事件脚本里面分开还可以继承的吗?
你前面设 var i = 0
这里是一个脚本。
下面 i = ++1
又是一段脚本。
i = ++1也是我没接触过的写法。
长知识了。
回复

使用道具 举报

梦石
0
星屑
5615
在线时间
2571 小时
注册时间
2011-9-27
回帖
1059

极短23参与开拓者

发表于 2020-7-19 10:07:56 | 显示全部楼层
  1. a=[3,5,7,9]
  2. list=a.shuffle
复制代码


在Ruby里面,数组内置 shuffle 方法,功能是打乱排序。  可以实现不重复的随机。

点评

这是MV板块  发表于 2020-7-19 10:54
从平淡走向更平淡。
回复

使用道具 举报

梦石
0
星屑
11809
在线时间
623 小时
注册时间
2016-8-25
回帖
1340

R考场第七期纪念奖

发表于 2020-7-19 12:38:01 | 显示全部楼层
没有思路

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

第二次随机抽取变量,抽到1的话再抽一次
直到不是一为止
回复 1 0

使用道具 举报

梦石
0
星屑
190
在线时间
25 小时
注册时间
2020-7-18
回帖
9
发表于 2020-7-19 23:29:59 | 显示全部楼层
本帖最后由 apporoad 于 2020-7-19 23:31 编辑

楼主,你的需求很简单,关键你的20个数字在哪里?
你可以直接加我qq,我直接给你免费写一个,分分钟的事情 969308614
回复 1 0

使用道具 举报

梦石
0
星屑
16261
在线时间
4014 小时
注册时间
2015-9-14
回帖
1322

开拓者

发表于 2020-7-19 23:55:21 | 显示全部楼层
本帖最后由 wabcmcc 于 2020-7-20 00:18 编辑

何不直接用插件.
用於創建隨機值而無需重複的插件
[fold=HzRandomList.js]/**
/*:
*
* @plugindesc 重複の無いランダム値を作成するプラグイン
* @author hiz
*
*  @help
*   特定の整数範囲の重複の無いランダム値を作成し、一つずつ取得することができます。
*   例えば1〜6のランダム値を作成した場合、1〜6の値を重複なくランダムな順番で取得することができます。
*   夜店のくじ等の(店がズルしてなければ)引き続ければいつかは当たるくじや、
*   ランダム値を使いたいけど同じ値が重複することは避けたい場合等に使えます。
*   ※ ランダム値の状態はセーブファイルに保存されます。
*  
* プラグイン コマンド:
*   HZRANDOM CREATE id min max loop             # min~max(max含む)のID[id]の乱数リストを作成します
*                                               # loopは任意設定です。(1:LOOP ON それ以外:LOOP OFF)
*                                               
*   HZRANDOM NEXT id varNo                      # ID[id]の乱数リストの次の要素を取得して、、変数[varNo]にセットします。
*                                               # 乱数リストの要素を全て取得した場合、
*                                               # LOOP ONの場合、最初の要素から取得し直します。
*                                               # LOOP OFFの場合、乱数リストをシャッフルします。
*                                               
*   HZRANDOM SHUFFLE id                         # ID[id]の乱数リストをシャッフルします。
*   
*   ※ プラグインコマンドの引数には、文章の表示と同様の特殊記号を使用できます。
*   
* 使用例)
*   HZRANDOM CREATE 1 1 3 false    -> 1~3の乱数リスト(ID=1)を作成(LOOP OFF)
*                                     例) [3, 1, 2]
*   HZRANDOM NEXT 1 1              -> 乱数リストの次の要素(上記例では3)を取得し、変数1に代入
*   HZRANDOM NEXT 1 1              -> 乱数リストの次の要素(上記例では1)を取得し、変数1に代入
*   HZRANDOM NEXT 1 1              -> 乱数リストの次の要素(上記例では2)を取得し、変数1に代入
*   HZRANDOM NEXT 1 1              -> 乱数リストの要素を全て取得したため、乱数リストをシャッフル
*                                     例) [2, 1, 3]
*                                     乱数リストの次の要素(上記例では2)を取得し、変数1に代入
*   HZRANDOM NEXT 1 1              -> 乱数リストの次の要素(上記例では1)を取得し、変数1に代入
*   HZRANDOM SHUFFLE 1             -> 乱数リストをシャッフル
*                                     例) [1, 3, 2]
*   HZRANDOM NEXT 1 1              -> 乱数リストの次の要素(上記例では1)を取得し、変数1に代入
*/

(function() {   
    function convertEscape(txt) {return Window_Base.prototype.convertEscapeCharacters(txt)};
   
    var _Game_Interpreter_pluginCommand =
            Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        // スクリプトコマンド「HZRANDOM」
        if (command.toUpperCase() === 'HZRANDOM') {
            var type = String(args[0]);
            if(type.toUpperCase() === 'CREATE') {
                // 「HZRANDOM CREATE」:ランダムリストの作成
                var id             = Number(convertEscape(args[1]));
                var min            = Number(convertEscape(args[2]));
                var max            = Number(convertEscape(args[3]));
                var loop           = args[4] != null ? Number(convertEscape(args[4])) == 1 : false;
                $gameSystem.putHzRandomList(id, new HzRandomList(min, max, loop));
            } else if(type.toUpperCase() === 'NEXT') {
                // 「HZRANDOM NEXT」:ランダムリストの次の要素を取得
                var id             = Number(convertEscape(args[1]));
                var varNo          = Number(convertEscape(args[2]));
                var nextValue      = $gameSystem.getNextHzRandomList(id);
                if(nextValue != null) {
                    $gameVariables.setValue(varNo, nextValue);
                }
            } else if(type.toUpperCase() === 'SHUFFLE') {
                // 「HZRANDOM NEXT」:ランダムリストの再シャッフル
                var id             = Number(convertEscape(args[1]));
                $gameSystem.shuffleHzRandomList(id);
            }
        }
    };
   
    //
    // ランダムリストはGame_Systemに保管。(セーブファイルに保存するため)
    //
    Game_System.prototype.putHzRandomList = function(id, list) {
        if(!this._hzrandomList) {
            this._hzrandomList = [];
        }
        this._hzrandomList[id] = list;
    };
   
    Game_System.prototype.getNextHzRandomList = function(id) {
        if(!this._hzrandomList) {
            this._hzrandomList = [];
        }
        if(!this._hzrandomList[id]) {
            return null;
        }
        return HzRandomList.next(this._hzrandomList[id]);
    };
   
    Game_System.prototype.shuffleHzRandomList = function(id) {
        if(!this._hzrandomList) {
            this._hzrandomList = [];
        }
        if(!this._hzrandomList[id]) {
            return;
        }
        HzRandomList.shuffle(this._hzrandomList[id]);
    };
   
    function HzRandomList() {
        this.initialize.apply(this, arguments);
    }
   
    /**
     * 初期化処理
     * @returns {Array|HzRandomList_L1.HzRandomList._list}
     */
    HzRandomList.prototype.initialize = function(min, max, loop) {
        this._min = min;
        this._max = max;
        this._loop = loop;
        if(this._min > this._max) {
            var tmp = this._min;
            this._min = this._max;
            this._max = tmp;
        }
        // min~max(max含む)の配列を作成
        this._list = new Array(this._max - this._min + 1);
        for(var i=0;i<this._max-this._min+1;i++) {
            this._list = this._min + i;
        }
        // 配列のシャッフル
        shuffle(this._list);
        // 次回取得時の配列のINDEX設定
        this._index = 0;
    };
   
    /**
     * ランダムリストの次の要素を返す
     * @returns {Array}
     */
    HzRandomList.next = function(list) {
        if(list._index >= list._list.length) {
            if(!list._loop) {
                // ループ設定OFFの場合、配列を再シャッフル
                shuffle(list._list);
            }
            // INDEXを0に戻す
            list._index = 0;
        }
        // ランダムリストの要素を取得
        var value = list._list[list._index];
        // インデックスをカウントアップ
        list._index ++;
        return value;
    };
   
    /**
     * 配列を再度シャッフルする
     * @returns {undefined}
     */
    HzRandomList.shuffle = function(list) {
        // 配列を再シャッフル
        shuffle(list._list);
        // INDEXを0に戻す
        list._index = 0;
    };
   
    /**
     * 配列のシャッフル用関数
     * @param {type} array
     * @returns {unresolved}
     */
    function shuffle(array) {
        var n = array.length, t, i;

        while (n) {
          i = Math.floor(Math.random() * n--);
          t = array[n];
          array[n] = array;
          array = t;
        }

        return array;
      }

})();
[/fold]
作者網誌: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

评分

参与人数 1赞 +1 收起 理由
北意大利 + 1 精品文章

查看全部评分

https://rpg.blue/data/attachment/album/202003/28/021323lltgrsvfytfwuya5.gif
回复 1 0

使用道具 举报

梦石
0
星屑
3130
在线时间
419 小时
注册时间
2015-8-8
回帖
371

R考场第七期纪念奖

发表于 2020-7-20 02:22:16 | 显示全部楼层
你有5个数,存在数组里,11 4 5 1 4
先变量1=随机1..5,然后抽出来第“变量1”个数,然后把这个数和第五个交换。比如抽出来3,数组就变成11 4 4 1 5
然后再变量1=随机1..4,再执行如上操作。这时候,因为5被放到了数组最后,所以就不会被抽到了。
这个算法好像叫扑克牌算法还是什么

点评

!谢谢!!涨姿势了!  发表于 2020-7-31 21:11
旧作《邵彦朝的大冒险》下载

默默无闻的论坛观察者
回复 1 0

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2020-7-20 08:03:12 | 显示全部楼层
偽随机        
回复 1 0

使用道具 举报

梦石
0
星屑
190
在线时间
25 小时
注册时间
2020-7-18
回帖
9
发表于 2020-7-20 08:33:54 | 显示全部楼层
本帖最后由 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:12
回复 1 0

使用道具 举报

梦石
0
星屑
1809
在线时间
199 小时
注册时间
2018-1-20
回帖
72
 楼主| 发表于 2020-7-31 21:08:41 | 显示全部楼层
yang1zhi 发表于 2020-7-19 09:56
等等。
我发现了一个新的写法
MV的事件脚本里面分开还可以继承的吗?

但是这样的写法经过修改以后还是报错 还是整体用脚本写比较保险x

点评

那就是这样的写法是不可取的....  发表于 2020-8-4 22:37
回复

使用道具 举报

梦石
1
星屑
15825
在线时间
5415 小时
注册时间
2017-2-18
回帖
413
发表于 2020-7-31 23:21:26 | 显示全部楼层
本帖最后由 阵颜 于 2020-7-31 23:50 编辑

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



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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部