加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 RPGzh500223 于 2022-2-2 21:32 编辑
class Array def to_int self.object_id end CallWndProc = Win32API.new('user32.dll', 'CallWindowProc', 'PLLLL', 'L') CodeSeed = [85,137,229,139,77,8,3,77,12,187,1,0,0,0,139,69,16,247,227, 3,69,20,137,195,193,232,16,37,255,127,0,0,226,236,137,216,201, 194,16,0].pack('C*') @@seed = CallWndProc.call(CodeSeed, rand(41), 10, 214013, 2531011) CodeShuffle = [85,137,229,139,93,8,139,76,27,8,131,249,1,118,55,139,116,27, 16,73,141,60,142,139,93,12,139,69,16,247,227,3,69,20,137,195,193,232,16, 37,255,127,0,0,49,210,65,247,241,73,193,226,2,1,242,255,50,255,55,143,2, 143,7,131,239,4,226,214,137,216,201,194,16,0].pack('C*') def shuffle! @@seed = CallWndProc.call(CodeShuffle, self, @@seed, 214013, 2531011) self end def shuffle (self + []).shuffle! end def sample self[rand(self.size)] end CodeSamples = [85,137,229,139,69,8,139,92,0,8,139,68,0,16,137,69,8,141,116, 152,252,139,69,12,139,76,0,8,81,139,68,0,16,141,124,136,252,184,253,67,3, 0,247,101,20,5,160,51,130,1,137,69,20,193,232,16,37,255,127,0,0,49,210, 247,243,75,193,226,2,3,85,8,255,50,255,54,143,2,143,6,137,23,131,239,4, 131,238,4,226,203,89,131,198,4,139,6,131,199,4,139,23,137,7,255,50,255, 54,143,2,143,6,226,234,139,69,20,201,194,16,0].pack('C*') def samples(n) len = self.size return self[rand(len), 1] if n < 2 n = len if n > len return self.shuffle if n == len result = Array.new(n) @@seed = CallWndProc.call(CodeSamples, self, result, 0, @@seed) result end end
class Array
def to_int
self.object_id
end
CallWndProc = Win32API.new('user32.dll', 'CallWindowProc', 'PLLLL', 'L')
CodeSeed = [85,137,229,139,77,8,3,77,12,187,1,0,0,0,139,69,16,247,227,
3,69,20,137,195,193,232,16,37,255,127,0,0,226,236,137,216,201,
194,16,0].pack('C*')
@@seed = CallWndProc.call(CodeSeed, rand(41), 10, 214013, 2531011)
CodeShuffle = [85,137,229,139,93,8,139,76,27,8,131,249,1,118,55,139,116,27,
16,73,141,60,142,139,93,12,139,69,16,247,227,3,69,20,137,195,193,232,16,
37,255,127,0,0,49,210,65,247,241,73,193,226,2,1,242,255,50,255,55,143,2,
143,7,131,239,4,226,214,137,216,201,194,16,0].pack('C*')
def shuffle!
@@seed = CallWndProc.call(CodeShuffle, self, @@seed, 214013, 2531011)
self
end
def shuffle
(self + []).shuffle!
end
def sample
self[rand(self.size)]
end
CodeSamples = [85,137,229,139,69,8,139,92,0,8,139,68,0,16,137,69,8,141,116,
152,252,139,69,12,139,76,0,8,81,139,68,0,16,141,124,136,252,184,253,67,3,
0,247,101,20,5,160,51,130,1,137,69,20,193,232,16,37,255,127,0,0,49,210,
247,243,75,193,226,2,3,85,8,255,50,255,54,143,2,143,6,137,23,131,239,4,
131,238,4,226,203,89,131,198,4,139,6,131,199,4,139,23,137,7,255,50,255,
54,143,2,143,6,226,234,139,69,20,201,194,16,0].pack('C*')
def samples(n)
len = self.size
return self[rand(len), 1] if n < 2
n = len if n > len
return self.shuffle if n == len
result = Array.new(n)
@@seed = CallWndProc.call(CodeSamples, self, result, 0, @@seed)
result
end
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_**方法为该帖的方法)
# 非代码 =begin rmva测试 【(0...10).to_a】 Array#suffle! : 148031次/秒 Array#suffle : 121141次/秒 Array#my_suffle! : 68741次/秒 Array#my_suffle : 60609次/秒 Array#sample(5) : 131731次/秒 Array#my_samples(5) : 55161次/秒 Array#sample(100) : 126950次/秒 Array#my_samples(100) : 56554次/秒 Array#sample(200) : 126669次/秒 Array#my_samples(200) : 56390次/秒 【(0...100).to_a】 Array#suffle! : 70314次/秒 Array#suffle : 60290次/秒 Array#my_suffle! : 59772次/秒 Array#my_suffle : 51764次/秒 Array#sample(5) : 131434次/秒 Array#my_samples(5) : 55044次/秒 Array#sample(100) : 67510次/秒 Array#my_samples(100) : 49509次/秒 Array#sample(200) : 66997次/秒 Array#my_samples(200) : 49541次/秒 【(0...500).to_a】 Array#suffle! : 20981次/秒 Array#suffle : 19097次/秒 Array#my_suffle! : 38931次/秒 Array#my_suffle : 32487次/秒 Array#sample(5) : 131307次/秒 Array#my_samples(5) : 54454次/秒 Array#sample(100) : 57960次/秒 Array#my_samples(100) : 45561次/秒 Array#sample(200) : 41348次/秒 Array#my_samples(200) : 38972次/秒 【(0...1000).to_a】 Array#suffle! : 11331次/秒 Array#suffle : 10317次/秒 Array#my_suffle! : 27282次/秒 Array#my_suffle : 22167次/秒 Array#sample(5) : 130697次/秒 Array#my_samples(5) : 55175次/秒 Array#sample(100) : 49234次/秒 Array#my_samples(100) : 45636次/秒 Array#sample(200) : 36858次/秒 Array#my_samples(200) : 39417次/秒 =end
# 非代码
=begin
rmva测试
【(0...10).to_a】
Array#suffle! : 148031次/秒
Array#suffle : 121141次/秒
Array#my_suffle! : 68741次/秒
Array#my_suffle : 60609次/秒
Array#sample(5) : 131731次/秒
Array#my_samples(5) : 55161次/秒
Array#sample(100) : 126950次/秒
Array#my_samples(100) : 56554次/秒
Array#sample(200) : 126669次/秒
Array#my_samples(200) : 56390次/秒
【(0...100).to_a】
Array#suffle! : 70314次/秒
Array#suffle : 60290次/秒
Array#my_suffle! : 59772次/秒
Array#my_suffle : 51764次/秒
Array#sample(5) : 131434次/秒
Array#my_samples(5) : 55044次/秒
Array#sample(100) : 67510次/秒
Array#my_samples(100) : 49509次/秒
Array#sample(200) : 66997次/秒
Array#my_samples(200) : 49541次/秒
【(0...500).to_a】
Array#suffle! : 20981次/秒
Array#suffle : 19097次/秒
Array#my_suffle! : 38931次/秒
Array#my_suffle : 32487次/秒
Array#sample(5) : 131307次/秒
Array#my_samples(5) : 54454次/秒
Array#sample(100) : 57960次/秒
Array#my_samples(100) : 45561次/秒
Array#sample(200) : 41348次/秒
Array#my_samples(200) : 38972次/秒
【(0...1000).to_a】
Array#suffle! : 11331次/秒
Array#suffle : 10317次/秒
Array#my_suffle! : 27282次/秒
Array#my_suffle : 22167次/秒
Array#sample(5) : 130697次/秒
Array#my_samples(5) : 55175次/秒
Array#sample(100) : 49234次/秒
Array#my_samples(100) : 45636次/秒
Array#sample(200) : 36858次/秒
Array#my_samples(200) : 39417次/秒
=end
|