Project1

标题: 如何让15个变量随机代入1-15这15个不同的数字 [打印本页]

作者: szzyc0    时间: 2009-7-12 08:51
标题: 如何让15个变量随机代入1-15这15个不同的数字
如何让15个变量随机代入1-15这15个不同的数字
作者: 我不宅    时间: 2009-7-12 09:23
是指第15个还是总共15个?说清楚点再帮你看看~~~
作者: 66rpg学习    时间: 2009-7-12 09:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: szzyc0    时间: 2009-7-12 10:40
总共15个变量
作者: IamI    时间: 2009-7-12 10:41
LS仅可生成15个随机数。如需生成15个互不相等的随机数且随机数在1-15之间,执行如下脚本即可。
  1. array = []
  2. for i in 1..15
  3.   array[i-1] = i
  4. end
  5. for i in 1..15
  6.   n = rand(array.size)
  7.   $game_variables[i] = array[n]
  8.   array.delete(array[n])
  9. end
复制代码

作者: tommay    时间: 2009-7-12 10:48
本帖最后由 tommay 于 2009-7-12 10:52 编辑

不知道我的理解对不对:
  1. $var = []
  2. i=1
  3. while i<16
  4.   j = rand(15)
  5.   if $var[j]==nil
  6.     $var[j]=i
  7.     i+=1
  8.   end
  9. end
  10. p $var
复制代码

作者: 后知后觉    时间: 2009-7-12 12:26
  1. a = []
  2. for i in 1..15
  3.   begin
  4.     b = rand(15) + 1
  5.   end until a.include?(b) == false
  6.   a[i - 1] = b
  7. end
复制代码

作者: 亿万星辰    时间: 2009-7-12 15:42
我也来
  1. array = (1..15).to_a
  2. result = []
  3. 15.times{result.push(array.delete_at(rand(array.size)))}
复制代码

作者: IamI    时间: 2009-7-12 16:22
殴打楼上。那个是C++的,根本通不过脚本编译
顺便寒一下亿万那个脚本
作者: 华华    时间: 2009-7-12 16:24
C粉自重……
作者: 越前リョーマ    时间: 2009-7-12 16:27
变量随机数,事件都做的到。
作者: 亿万星辰    时间: 2009-7-12 17:14
殴打楼上。那个是C++的,根本通不过脚本编译
顺便寒一下亿万那个脚本
IamI 发表于 2009-7-12 16:22

为啥要寒人家……{:3_50:}
作者: dbshy    时间: 2009-7-12 18:10
亿万施主,老衲等着看你的脚本教程,阿弥陀佛

--------------快感炮王的防水补丁------------------------
用事件做吧
作者: tommay    时间: 2009-7-12 19:56
受教!

12# 越前リョーマ
然后弱问小柯如何用事件做?
作者: 新月の道化师    时间: 2009-7-12 23:12
a = {0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15}
for i in 1..15
b[i]=a.shift[1]
作者: 越前リョーマ    时间: 2009-7-13 00:02
本帖最后由 越前リョーマ 于 2009-7-13 00:03 编辑
受教!

12# 越前リョーマ
然后弱问小柯如何用事件做?
tommay 发表于 2009-7-12 19:56

不是给15个变量分别代入1~15的数字么?
直接变量操作:随机数1~15 即可。
不过由于是15个不同,所以要操作15次。

但是呢,如果变量的批操作也允许生成的随机数代入变量组是不同的话,也可以直接批操作,那样就简单多了。

如果是我理解错误,请自行处理。
---------------------------------------------------
好吧,我理解错了。不过还是做的到,就是麻烦点。

首先拿一个变量随机数,然后下一个变量随机数,条件分歧一样的话就重新随机数。虽然这样很麻烦,但是依旧可以做到。
作者: 亿万星辰    时间: 2009-7-13 07:38
本帖最后由 亿万星辰 于 2009-7-13 07:39 编辑
首先拿一个变量随机数,然后下一个变量随机数,条件分歧一样的话就重新随机数。虽然这样很麻烦,但是依旧可以做到。
越前リョーマ 发表于 2009-7-13 00:02

这里要考虑一个效率问题,本来整个过程应该有15次赋值操作,但用这样的方法非但增加了一个条件判断,同时还使得赋值操作的次数变得大于等于15次,也就是如果随机数15次恰好没有取重复的话是15次,否则就会多于15次了。所以说,就要考虑只做15次操作来实现整个目的。
先将1~15存储到一个数组中,接着依次从中随机拿走一个元素放入到目标数组中,这样的操作就必然是15次完成想要完成的操作了。
当然,如果理解事件操作不包括事件里的脚本的话,那实现起来就比较困难了。
作者: 玄月    时间: 2009-7-13 07:52
本帖最后由 玄月 于 2009-7-13 08:07 编辑

更正 - -
  1.   x = []
  2.   for i in 1...16
  3.     x[rand(i),0] = [i]
  4.   end
  5.   p x
  6.   for i in 0...15
  7.     $game_variables[i] = x[i]
  8.     p $game_variables[i]
  9.   end  
  10.   
复制代码
这次这个没错了,简单明了,已经过测试
作者: tommay    时间: 2009-7-13 08:34
17# 越前リョーマ


如此说来,事件有何意义呢?
作者: 紫苏    时间: 2009-7-13 11:28
本帖最后由 紫苏 于 2009-7-13 11:29 编辑

要论效率的话,改变动态数组的长度效率无论如何也比不上交换元素吧,所以筛法是公认效率最高的方法:顺序储存 1-15 这 15 个数,生成随机数,从还未筛选的数中取走在随机数位置的那个元素,直到倒数第二个未筛选的数也筛选完毕
  1. for i in 1..15
  2. $game_variables[i] = i
  3. end

  4. i = 14
  5. begin
  6. r = rand(i) + 1
  7. # 交换两个元素
  8. $game_variables[i + 1] ^= $game_variables[r]
  9. $game_variables[r] ^= $game_variables[i + 1]
  10. $game_variables[i + 1] ^= $game_variables[r]
  11. end until (i -= 1) < 2
复制代码

作者: 新月の道化师    时间: 2009-7-13 15:09
本帖最后由 新月の道化师 于 2009-7-13 15:18 编辑

弱弱的问下21L...
^=是什么意思,找了下米找到...
交换位置的方法总觉得有些怪怪的...偶还是觉得直接用hash最方便...

================
想了下子,偶觉得交换似乎是牺牲了时间复杂度换取空间复杂度的感觉,感觉还是从数组或者hash中抽取效率要高些...个人感觉>_<
作者: 亿万星辰    时间: 2009-7-13 15:27
本帖最后由 亿万星辰 于 2009-7-13 21:48 编辑

从来没想过用这样的方法来实现呢……
看了看确实有那么点意思~学习了~

这个交换变量值的方法第一次见,不错。

还有这个“改变动态数组的长度效率无论如何也比不上交换元素”这个是怎么知道的?
我测了一下效率是我那个方法的两倍~
作者: 越前リョーマ    时间: 2009-7-13 20:02
17# 越前リョーマ


如此说来,事件有何意义呢?
tommay 发表于 2009-7-13 08:34

意义在于事件也能完成这个事情。
你问的是如何完成,我这不完成了么?麻烦不等于无法完成。
作者: 玄月    时间: 2009-7-13 21:30
总之都在借帖聊天了 - - 说来我那个不好么,何必弄这么多复杂的算法呢
作者: 紫苏    时间: 2009-7-13 21:47
本帖最后由 紫苏 于 2009-7-13 23:40 编辑
弱弱的问下21L...
^=是什么意思,找了下米找到...
交换位置的方法总觉得有些怪怪的...偶还是觉得直接用hash最方便...
新月の道化师 发表于 2009-7-13 15:09

自异或运算,这是最高效的交换两个整数的方法~
两次异或相同的数后会得到原数,所以可以用来交换两个变量的值

浮点的话,则是用 +- 交换的方法~

想了下子,偶觉得交换似乎是牺牲了时间复杂度换取空间复杂度的感觉,感觉还是从数组或者hash中抽取效率要高些...个人感觉>_<
新月の道化师 发表于 2009-7-13 15:09

怎么会呢,从数组中抽取不也占用了一个数组嘛~最后得到的数也是需要空间占用的
而且就算换也是换了时间复杂度……

用了星子的那段代码,比较两个方法执行的时间,运算量大的时候就可以看出差别了:
  1. def genRandom1(n)
  2.   arr = Array.new(n)
  3.   for i in 0...arr.size
  4.     arr[i] = i
  5.   end
  6.   i = n - 1
  7.   begin
  8.     r = rand(i)
  9.     arr[i] ^= arr[r]
  10.     arr[r] ^= arr[i]
  11.     arr[i] ^= arr[r]
  12.   end until (i -= 1) < 1
  13.   return arr
  14. end

  15. def genRandom2(n)
  16.   array = (0...n).to_a
  17.   result = []  
  18.   n.times{result.push(array.delete_at(rand(array.size)))}
  19.   return result
  20. end

  21. a = Time.now
  22. genRandom1(60000)
  23. p Time.now - a

  24. a = Time.now
  25. genRandom2(60000)
  26. p Time.now - a
复制代码
动态数组也是线性数据结构,底层还是静态的顺序数组,当数组需要插入/删除元素时,就会有一个线性的批量元素替换,比如插入时从插入点往后的元素依次后移,删除时则是依次往前移~
作者: 亿万星辰    时间: 2009-7-14 08:49
研究到这么深的层次了,厉害……  = =|||
作者: IamI    时间: 2009-7-14 09:07
我是来飘的,无法想像LZ看到3页回帖时的表情
不知道用Table效率如何
作者: tommay    时间: 2009-7-14 09:38
我是一块砖,每每有这种技术贴,我都是用来抛的= =




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