找回密码
 点一下
查看: 2121|回复: 38

求一个随机整数的算法

[复制链接]
发表于 2009-5-26 19:27:27 | 显示全部楼层 |阅读模式
就是问一下,我想设置一个变量组random[x]有10个  每一个变量在1-30里面随机取一个数,要求不重复,怎么计算方便点呢?

想是想出来了一种办法 但是觉得太苯了想问以下也没有简单的方法
发表于 2009-5-26 19:33:40 | 显示全部楼层
数组1-30,随机交换数组中2个元素,重复n次,取前10个……
数组1-30,去数组中的随机不为0的元素,并将此元素赋值为0,重复10次……

等等
回复

使用道具 举报

 楼主| 发表于 2009-5-26 20:02:33 | 显示全部楼层
交换???

我明白什么意思了但是这个交换怎么操作?
回复

使用道具 举报

发表于 2009-5-26 20:22:17 | 显示全部楼层
利用中间变量,反正数组项多得很
回复

使用道具 举报

发表于 2009-5-26 20:26:44 | 显示全部楼层
  1. int a
  2. int b
  3. int c=0
  4. random[1] = 999
  5. ...
  6. random[10] = 999
  7. 以a从30~21做循环
  8.   设置 random[a-20] = 随机数在 1~a 之间
  9.   set c=0
  10.   以b从1 ~ 10 做循环
  11.     if random[a-20] > ramdom[b] then
  12.            set c=c+1
  13.         endif
  14.     endloop b
  15.     set random[a-20]=random[a-20]+c
  16. endloop a
复制代码

你试试这样子 我还没检查对不对
回复

使用道具 举报

发表于 2009-5-26 20:31:00 | 显示全部楼层
hmmm,jass里的整数是integer,局部变量要用local
我上面说的第二种方法其实比较好实现

[codes=jass]globals
    integer array random
    integer array source   
endglobals

function XXX takes nothing returns nothing
    local integer i = 0
    local integer i2
    loop
        exitwhen i >= 30
        set source = i + 1
        set i = i + 1
    endloop
    set i = 0
    loop
        exitwhen i >= 10
        loop
            set i2 = GetRandomInt(0, 29)
            set random = source[i2]
            set source[i2] = 0
            exitwhen random > 0
        endloop
        set i = i + 1
    endloop
endfunction[/codes]
回复

使用道具 举报

发表于 2009-5-26 20:47:52 | 显示全部楼层
咱确实很嫩 楼上的方法更巧些
回复

使用道具 举报

发表于 2009-5-26 20:58:07 | 显示全部楼层
[codes=jass]globals
    integer array random  
endglobals

function XXX takes nothing returns nothing
    local integer i = 0
    local integer i1
    local integer i2
    local integer temp
    loop
        exitwhen i >= 30
        set random = i + 1
        set i = i + 1
    endloop
    set i = GetRandomInt(400, 600)
    loop
        set i1 = GetRandomInt(0, 29)
        set i2 = GetRandomInt(0, 29)
        set temp = random[i1]
        set random[i1] = random[i2]
        set random[i2] = temp
        set i = i - 1
        exitwhen i <= 0
    endloop
endfunction[/codes]

于是给一下第一种方法的实现
回复

使用道具 举报

 楼主| 发表于 2009-5-26 21:10:23 | 显示全部楼层
你猜我怎么弄的~~~



很苯   

但是对于我来说很好理解~~~
回复

使用道具 举报

发表于 2009-5-26 21:13:40 | 显示全部楼层
第一种方法好,第二种不稳定
回复

使用道具 举报

发表于 2009-5-26 21:15:27 | 显示全部楼层
弱弱的问下, 7楼的方法会不会出现重复的呀
回复

使用道具 举报

发表于 2009-5-26 21:22:40 | 显示全部楼层
引用第10楼Conflux于2009-05-26 21:15发表的  :
弱弱的问下, 7楼的方法会不会出现重复的呀

不会阿,原理是把任意2项交换,重复400-600次
回复

使用道具 举报

发表于 2009-5-26 21:23:10 | 显示全部楼层
其实咱地下室的方法是最好的... 不会有走不出去的循环

即使是5楼... 这个循环如果运气差到家 也有可能走不出去 虽然几率比电脑蓝屏还要少得多
  1.         loop
  2.             set i2 = GetRandomInt(0, 29)
  3.             set random[i] = source[i2]
  4.             set source[i2] = 0
  5.             exitwhen random[i] > 0
  6.         endloop
复制代码
回复

使用道具 举报

发表于 2009-5-26 21:25:07 | 显示全部楼层
5楼的确有点rp,不过7楼可不会哦
不过效率嘛,嘿嘿
回复

使用道具 举报

发表于 2009-5-27 00:05:45 | 显示全部楼层
[codes=jass]
globals
    integer array random
endglobals

function Vi_Shen_Me_De_Zui_Tao_Yan_Le takes nothing returns nothing
    local integer i = 1
    local integer j
    local integer temp
    local integer start
    loop
        exitwhen i > 30
        if random == 0 then
            set random = i
        endif
        set j = GetRandomInt(1, 30)
        if i == j then
            if j == 30 then
                set j = 1
            else
                set j = j + 1
            endif
        endif
        if random[j] == 0 then
            set random[j] = j
        endif
        set temp = random
        set random = random[j]
        set random[j] = temp
        set i = i + 1        
    endloop
   
    //可以只取前10个,不用下面这段
    set start = GetRandomInt(0, 20)
    set i = 1
    loop
        exitwhen i > 30
        if i <= 10 then
            set random = random[start + i]
        else
            set random = 0
        endif
        set i = i + 1
    endloop
endfunction
[/codes]
回复

使用道具 举报

发表于 2009-5-27 07:24:18 | 显示全部楼层
如果觉得交换效率低,还有个方法

[jass]
function XXX takes nothing returns nothing
    local integer i = 0
    local integer rnd
    loop
         exitwhen i > 29
         set source = i + 1
         set i = i + 1
     endloop
     set i = 0
     loop
         exitwhen i > 9
         set rnd = GetRandomInt(i, 29)
         set random = source[rnd]
         set source[rnd] = source
         set i = i + 1
     endloop
endfunction
[/jass]

思路是这样,代码不保证一定对......
回复

使用道具 举报

发表于 2009-5-27 09:08:00 | 显示全部楼层

回 15楼(actboy168) 的帖子

思路应该对的... 可是最后的交换出问题了
回复

使用道具 举报

发表于 2009-5-27 09:28:32 | 显示全部楼层
最后不是交换,也不需要交换
回复

使用道具 举报

发表于 2009-5-27 09:56:24 | 显示全部楼层
g=CreateGroup()
loop 30
{
GroupAddUnit(g,u)
}

i = GetRandonInt(1,30)

loop 10
{
if ForGroupIndex==i
GroupRemove(u)
AddUnitToList(u)
}
回复

使用道具 举报

发表于 2009-5-27 10:16:45 | 显示全部楼层
感觉上面这些算法的空间至少都等于MaxRnd - MinRnd + 1,如果随机范围>>取值数组大小的话,还是用那个很RP的算法为好~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-7-21 22:21 , Processed in 0.073575 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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