设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3029|回复: 14
打印 上一主题 下一主题

删了

[复制链接]

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
跳转到指定楼层
1
发表于 2020-12-28 14:28:19 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 RPGzh500223 于 2021-2-7 19:36 编辑

删了删了删了

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

9
发表于 2020-12-31 14:53:15 | 只看该作者
本帖最后由 RyanBern 于 2020-12-31 15:00 编辑

5 楼猫叔的代码总觉的哪里不对 。随机给比较赋值有可能根本定义不出来全序,虽然看起来也打乱了但是随机性就不知道是啥了。
应该用 sort_by 来完成。见 https://stackoverflow.com/questi ... le-an-array-in-ruby
RUBY 代码复制
  1. a.sort_by { rand }


下面这个实现也很不错,是 shuffle 的标准实现。如果是 sample 的话也只需要简单修改即可完成任务。
RUBY 代码复制
  1. class Array
  2.   # Standard in Ruby 1.8.7+. See official documentation[[url]http://ruby-doc.org/core-1.9/classes/Array.html[/url]]
  3.   def shuffle
  4.     dup.shuffle!
  5.   end unless method_defined? :shuffle
  6.  
  7.   # Standard in Ruby 1.8.7+. See official documentation[[url]http://ruby-doc.org/core-1.9/classes/Array.html[/url]]
  8.   def shuffle!
  9.     size.times do |i|
  10.       r = i + Kernel.rand(size - i)
  11.       self[i], self[r] = self[r], self[i]
  12.     end
  13.     self
  14.   end unless method_defined? :shuffle!
  15.  
  16.   def sample(n = 1)
  17.     n = [n, size].min
  18.     tmp = self.clone
  19.     n.times do |i|
  20.       r = i + Kernel.rand(size - i)
  21.       tmp[i], tmp[r] = tmp[r], tmp[i]
  22.     end
  23.     tmp[(0...n)]
  24.   end unless method_defined? :sample
  25. end

点评

这猫叔,醋  发表于 2021-1-1 16:22
想了想确实不是纯随机……首先第一个元素的位置应该是二项分布  发表于 2021-1-1 02:45
据说sort用的是快排,rb快来证明一下随机快排是不是纯随机~  发表于 2020-12-31 15:46
我以为sort_by是很晚版本才出现的method……  发表于 2020-12-31 15:45

评分

参与人数 1+1 收起 理由
SixRC + 1 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
8
 楼主| 发表于 2020-12-29 14:28:09 | 只看该作者
guoxiaomi 发表于 2020-12-28 23:06
其实可以简单的把数组shuffle一下:

学到了新方法
网上查了下
a.sort!{……} 对应的该是 a.shuffle!吧 ?

点评

很有可能  发表于 2020-12-29 16:11
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
7
 楼主| 发表于 2020-12-29 14:19:55 | 只看该作者
本帖最后由 RPGzh500223 于 2020-12-29 14:29 编辑
芯☆淡茹水 发表于 2020-12-28 15:55
那有什么办法,只有自己写呗。
还有,照你这个办法,万一数组是 [1,1,2,3,3,4] 的情况呢?


后面的方法很好啊
第一次知道sort{}可以只带一个参数
利用随机值,实现随机排列
结合5楼的回复,这随机值取值范围必须正负对称?

点评

随意,看你想怎么来排列  发表于 2020-12-29 17:40
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
6
 楼主| 发表于 2020-12-29 14:11:16 | 只看该作者
enghao_lim 发表于 2020-12-28 22:49
有时候简单的方式并不会不好,LZ的我就觉得相当不错。LZ的代码我也没测试过,只是读了觉得思路是对的。
这 ...

好像有点跑题
不过还是学习到新内容了
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

5
发表于 2020-12-28 23:06:43 | 只看该作者
本帖最后由 guoxiaomi 于 2020-12-28 23:10 编辑

其实可以简单的把数组shuffle一下:
  1. a = [1,2,3,4,5,6]
  2. a.sort!{rand(2) * 2 - 1}
复制代码

评分

参与人数 1星屑 +20 收起 理由
RyanBern + 20 我很赞同

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 1 反对 0

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7981
在线时间
1183 小时
注册时间
2007-7-29
帖子
2055
4
发表于 2020-12-28 22:49:08 | 只看该作者
有时候简单的方式并不会不好,LZ的我就觉得相当不错。LZ的代码我也没测试过,只是读了觉得思路是对的。
这里给出思路相同可是写法不同的方法,随机不重复,终归就那几种,如果不是要在什么很夸张的大数抽取很夸张的样本,简单的就够了。
  1. def sample(size, n)
  2.   return nil if n < 1 || size < 1 || size < n
  3.   arr = []
  4.   (0...size).each{|i| arr.push(i)}
  5.   res = []
  6.   (0...n).each{|i|
  7.     k = rand(arr.size)
  8.     res.push(arr[k])
  9.     arr.delete(arr[k])
  10.   }
  11.   return res
  12. end
  13. print sample(10, 5)
复制代码

话说回来才如果抽取数和取样数一样就变成随机排列了……(size == n)
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
3
 楼主| 发表于 2020-12-28 18:46:05 | 只看该作者
本帖最后由 RPGzh500223 于 2020-12-28 18:50 编辑
芯☆淡茹水 发表于 2020-12-28 15:55
那有什么办法,只有自己写呗。
还有,照你这个办法,万一数组是 [1,1,2,3,3,4] 的情况呢?


标题写错了
不重复的随机选取元素
反正就是数组的值重复没关系,选取的元素索引不重复就行
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33464
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

2
发表于 2020-12-28 15:55:15 | 只看该作者
本帖最后由 芯☆淡茹水 于 2020-12-28 16:06 编辑

那有什么办法,只有自己写呗。
还有,照你这个办法,万一数组是 [1,1,2,3,3,4] 的情况呢?

依照你的思路,估计应该是这样吧
  1. class Array
  2.   def sample(n=1)
  3.     return [] unless n.is_a?(Integer) && n > 0
  4.     arr = self | self
  5.     temp = []
  6.     n = [arr.size, n].min
  7.     while temp.size < n
  8.       obj = arr[rand(arr.size)]
  9.       !temp.include?(obj) && temp.push(obj)
  10.     end
  11.     return temp
  12.   end
  13. end
复制代码


或者再随便怎样写都可以

  1. class Array
  2.   def sample(n=1)
  3.     return [] unless n.is_a?(Integer) && n > 0
  4.     arr = (self | self).sort{0.5 - rand}
  5.     n = [arr.size, n].min
  6.     return arr[0...n]
  7.   end
  8. end
复制代码
xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 18:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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