扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 104|回复: 0

[转载发布] Array#shuffle! #shuffle #samples (优化)

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 127 天

    连续签到: 11 天

    [LV.7]常住居民III

    2341

    主题

    417

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    11285
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    14071

    灌水之王

    发表于 2024-4-20 02:17:41 | 显示全部楼层 |阅读模式
    RUBY 代码
    1. classArray
    2.   def to_int
    3.     self.object_id
    4.   end
    5.   CallWndProc = Win32API.new('user32.dll', 'CallWindowProc', 'PLLLL', 'L')
    6.   CodeSeed = [85,137,229,139,77,8,3,77,12,187,1,0,0,0,139,69,16,247,227,
    7.     3,69,20,137,195,193,232,16,37,255,127,0,0,226,236,137,216,201,
    8.     194,16,0].pack('C*')
    9.   @@seed = CallWndProc.call(CodeSeed, rand(41), 10, 214013, 2531011)
    10.   CodeShuffle = [85,137,229,139,93,8,139,76,27,8,131,249,1,118,55,139,116,27,
    11.     16,73,141,60,142,139,93,12,139,69,16,247,227,3,69,20,137,195,193,232,16,
    12.     37,255,127,0,0,49,210,65,247,241,73,193,226,2,1,242,255,50,255,55,143,2,
    13.     143,7,131,239,4,226,214,137,216,201,194,16,0].pack('C*')
    14.   def shuffle!
    15.     @@seed = CallWndProc.call(CodeShuffle, self, @@seed, 214013, 2531011)
    16.     self
    17.   end
    18.   def shuffle
    19.     (self + []).shuffle!
    20.   end
    21.   def sample
    22.     self[rand(self.size)]
    23.   end
    24.   CodeSamples = [85,137,229,139,69,8,139,92,0,8,139,68,0,16,137,69,8,141,116,
    25.     152,252,139,69,12,139,76,0,8,81,139,68,0,16,141,124,136,252,184,253,67,3,
    26.     0,247,101,20,5,160,51,130,1,137,69,20,193,232,16,37,255,127,0,0,49,210,
    27.     247,243,75,193,226,2,3,85,8,255,50,255,54,143,2,143,6,137,23,131,239,4,
    28.     131,238,4,226,203,89,131,198,4,139,6,131,199,4,139,23,137,7,255,50,255,
    29.     54,143,2,143,6,226,234,139,69,20,201,194,16,0].pack('C*')
    30.   def samples(n)
    31.     len = self.size
    32.     returnself[rand(len), 1]if n < 2
    33.     n = len if n > len
    34.     returnself.shuffleif n == len
    35.     result = Array.new(n)
    36.     @@seed = CallWndProc.call(CodeSamples, self, result, 0, @@seed)        
    37.     result
    38.   end
    39. end
    复制代码


    \s又是一年……,想起也在论坛发帖问过Array#sample\s

    使用 Fisher-Yates 算法(几十年前的……,也是目前网上搜索最常见的洗牌算法)
    随机则是参照C语言的rand()函数写的,使用该方法的数组大小不能超过0x7FFF

    Array#shuffle!  => array_obj
    Array#shuffle   => array_obj
    Array#sample  => array_element_obj
    Array#samples => array_obj

    该帖方法效率基本为RUBY的同名或类似方法的十分之一 (RMVA测试)
    由于是调用win32api的CallWidnowProc实现(最简单的code测试 8.5-8.6W次/秒……),较小运算量比不过ruby方法直接执行,运算量大的情况RMXP基本用不到……

    优化:
    ①参数的改变,看起来更直接( 使用obj;原来obj.object_id。参数实质没变,效率我是感觉没差)
    ②优化了Array#samples,原先并没有用好result的内存……


    关于效率测试,具体次数与电脑性能相关(my_**方法为该帖的方法)

    RUBY 代码
    1. # 非代码
    2. =begin
    3. rmva测试
    4. 【(0...10).to_a】
    5.   Array#suffle! :                         148031次/秒
    6.   Array#suffle :                          121141次/秒
    7.   Array#my_suffle! :                       68741次/秒
    8.   Array#my_suffle :                        60609次/秒
    9.   Array#sample(5) :                       131731次/秒
    10.   Array#my_samples(5) :                    55161次/秒
    11.   Array#sample(100) :                     126950次/秒
    12.   Array#my_samples(100) :                  56554次/秒
    13.   Array#sample(200) :                     126669次/秒
    14.   Array#my_samples(200) :                  56390次/秒
    15. 【(0...100).to_a】
    16.   Array#suffle! :                          70314次/秒
    17.   Array#suffle :                           60290次/秒
    18.   Array#my_suffle! :                       59772次/秒
    19.   Array#my_suffle :                        51764次/秒
    20.   Array#sample(5) :                       131434次/秒
    21.   Array#my_samples(5) :                    55044次/秒
    22.   Array#sample(100) :                      67510次/秒
    23.   Array#my_samples(100) :                  49509次/秒
    24.   Array#sample(200) :                      66997次/秒
    25.   Array#my_samples(200) :                  49541次/秒
    26. 【(0...500).to_a】
    27.   Array#suffle! :                          20981次/秒
    28.   Array#suffle :                           19097次/秒
    29.   Array#my_suffle! :                       38931次/秒
    30.   Array#my_suffle :                        32487次/秒
    31.   Array#sample(5) :                       131307次/秒
    32.   Array#my_samples(5) :                    54454次/秒
    33.   Array#sample(100) :                      57960次/秒
    34.   Array#my_samples(100) :                  45561次/秒
    35.   Array#sample(200) :                      41348次/秒
    36.   Array#my_samples(200) :                  38972次/秒
    37. 【(0...1000).to_a】
    38.   Array#suffle! :                          11331次/秒
    39.   Array#suffle :                           10317次/秒
    40.   Array#my_suffle! :                       27282次/秒
    41.   Array#my_suffle :                        22167次/秒
    42.   Array#sample(5) :                       130697次/秒
    43.   Array#my_samples(5) :                    55175次/秒
    44.   Array#sample(100) :                      49234次/秒
    45.   Array#my_samples(100) :                  45636次/秒
    46.   Array#sample(200) :                      36858次/秒
    47.   Array#my_samples(200) :                  39417次/秒
    48. =end
    复制代码




                 本帖来自P1论坛作者RPGzh500223,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=488426  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-4-4 01:36 , Processed in 0.102266 second(s), 53 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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