【问题标题】:AHK script of random array随机数组的AHK脚本
【发布时间】:2014-03-30 20:02:07
【问题描述】:

脚本需要随机输出一个文件名:

Gui, Add, Edit, x25 y25 h150 w200 vSN, Enter names here
Gui, Add, Edit, x25 y185 h25 w200 vRT, Project Name
Gui, Add, Button, x25 y225 h25 w200, Generate
Gui, Show, x375 y200 h270 w250, Area Assignment by PS Cebu Team
FormatTime, TimeString,, MM d, yyyy
return
ButtonGenerate:
Gui, Submit, NoHide
{ 
  count := 1
  StringSplit, lines, SN, `n
  Loop, %lines0%
  {
    content := lines%a_index%
    FileAppend, Area %count% --- %content% `n, %RT% - %TimeString%.txt
    count++
  }
  return
  guiclose:
  exitapp
}

输出的名字应该是随机的。

【问题讨论】:

    标签: autohotkey


    【解决方案1】:

    如果你是面向对象类型的程序员,你也可以在 AHK_L 中使用实际的数组:

    SN = James`nJohn`nRobert`nMichael
    
    nameArr := StrSplit(SN, "`n")
    ArrayShuffle(nameArr)
    for i, name in nameArr
    {
        FileAppend, Random name: %name%, somewhere.txt
    }
    
    ; Fisher-Yates shuffle
    ArrayShuffle(arr) {
        i := arr.MaxIndex()
        while(i > 1) {
            Random, rnd, 1, % i
            tmp := arr[rnd]
            arr[rnd] := arr[i]
            arr[i] := tmp
            i--
        }
        return arr
    }
    

    这样,您可以控制洗牌算法,我使用了Fisher–Yates shuffle 的实现。您还可以更进一步,利用Arrays.ahk,可选择向其中添加改组功能。

    附注:
    也许,您应该检查 Project name 编辑内容的有效性,因为您直接将它们用作文件名。如果用户不小心输入了非法字符,你的程序就会崩溃。

    【讨论】:

    • 好节目,MCL。很高兴你能这样详细说明。
    • 谢谢~很有用
    【解决方案2】:

    用途:

    Sort, SN, Random
    

    这将对你的字符串进行随机排序...之后,你应该拆分它。

    随机排序数组并不容易,因为它有键和值对。
    所以我们尝试在将其转换为数组之前对其进行随机化。

    排序也默认分隔新行。但是,如果您想使用自定义分隔符,请使用 D 选项。喜欢:

    # this will sort a string delimited by a comma
    Sort, SN, Random D,
    

    这是一个未经测试的代码(因为我不使用 AHK)但它应该可以工作:

    Gui, Add, Edit, x25 y25 h150 w200 vSN, Enter names here
    Gui, Add, Edit, x25 y185 h25 w200 vRT, Project Name
    Gui, Add, Button, x25 y225 h25 w200, Generate
    Gui, Show, x375 y200 h270 w250, Area Assignment by PS Cebu Team
    FormatTime, TimeString,, MM d, yyyy
    return
    ButtonGenerate:
    Gui, Submit, NoHide
    { 
      count := 1
      # randomly sort the string delimited by `n first
      Sort, SN, Random
      # then convert it to the array
      StringSplit, lines, SN, `n
      Loop, %lines0%
      {
        content := lines%a_index%
        FileAppend, Area %count% --- %content% `n, %RT% - %TimeString%.txt
        count++
      }
      return
      guiclose:
      exitapp
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多