本机的Vim随机数的脚本(Native Vim Random number script)

2019-08-01 03:55发布

我知道,有各种方式来获得随机数,例如,从外壳。 不过,我在Android手机上运行vim的非常少中编译,而且,它不必是严格随机的。 问题是,什么是有趣的,或简洁,或快(即与VIM原生功能),或短的方式来获得相当不错的随机数在Vim的序列?

Answer 1:

尝试类似

function Rand()
    return str2nr(matchstr(reltimestr(reltime()), '\v\.@<=\d+')[1:])
endfunction

。 我不知道有更好的选择,然后使用一些时间函数(有其中的两个: reltime()localtime()但后者只更新每秒)。 我宁愿要么避免随机数或使用pyeval('random.randint(1, 10)')前面有python import random ),因为外壳是缓慢的,我不相信基于时间的解决方案。

注:文件说,通过返回的项目的格式reltime()取决于系统,因此我使用reltimestr()不这样做的东西reltime()[1]它看起来像它是否包含纳秒。



Answer 2:

我最近打得四处在Vim脚本自己的随机数。 这里有一些资源,我在这个过程中发现的。

没有Vim脚本

通过一切手段,如果你能使用外部随机数发生器。 作为一项规则,他们比任何可能在Vim脚本来实现更好更快发展。

例如,尝试

  • :python import random; print random.randrange(1, 7)
  • :echo system('echo $RANDOM')
  • 另一种脚本语言, 例如红宝石

图书馆

Vim脚本库。 这些希望努力为客户提供体面的质量RNG实现。

  • vital.vim是由VIM-JP用户组创建了一个出色和全面的图书馆。 他们随机数发生器运动功能的一系列令人印象深刻,是最好的纯Vim脚本RNG我知道的。 vital.vim使用的Xorshift算法 。 看看这个!

    滚动与vital.vim模具:

     let Random = vital#of('vital').import('Random') echo Random.range(1, 7) 
  • VIM-RNG是一个小的随机数生成器插件。 该公司出口一对夫妇的依赖于全球功能乘用携带的算法 。 该项目似乎是一项正在进行的工作。

    滚动与RNG模具:

     echo RandomNumber(1, 6) 
  • magnum.vim是我自己有点大整数库。 我最近增加了一个随机数发生器产生的任何大小的整数。 它使用XORSHIFT-ADD算法 。

    滚动与magnum.vim模具:

     let six = magnum#Int(6) echo magnum#random#NextInt(six).Add(magnum#ONE).Number() 
  • RNDM已经出现了比其他图书馆长得多。 它的功能暴露为一对夫妇的全局函数。 滚动与RNDM模具:

     echo Urndm(1, 6) 

讨论与片段

最后,几个环节,以精辟的论述和Vim脚本片段。

  • ZYX的reltime片段此页面上。

  • loreb的GitHub上vimprng项目在Vim脚本RNG实现了数量惊人。 很有用。

  • 这个古老的邮件列表讨论有几个Vim脚本片段。 通过蜂9给出的第一个被限制在16位,但我觉得这是很有效的。 这里是:

     let g:rnd = localtime() % 0x10000 function! Random(n) abort let g:rnd = (g:rnd * 31421 + 6927) % 0x10000 return g:rnd * a:n / 0x10000 endfunction 
  • 另一个剧本 ,一个人发现命名Bart的个人配置文件。

  • 上Vimcasts.org插曲57讨论Vim的“表达式寄存器”,指的是在整个随机数的示例。 指的是这个问题的#1和ZYX的片段。 推荐的。

  • Wikia的上Vim的维基百科上有一篇文章“跳转到一个随机线” ,目前尚未未提及的一些资源。



Answer 3:

基于别人的答案,并从互联网上其他资源,我已经写了两个函数来产生在给定范围内的随机整数[Low, High]

无论是两个函数接收两个参数: LowHigh ,并在此范围内返回一个随机数。

结合Python和Vim脚本

第一个功能结合Python和Vim脚本。

" generate a random integer from range [Low, High] using Python
function! RandInt(Low, High) abort
" if you use Python 3, the python block should start with `python3` instead of
" `python`, see https://github.com/neovim/neovim/issues/9927
python3 << EOF
import vim
import random

# using vim.eval to import variable outside Python script to python
idx = random.randint(int(vim.eval('a:Low')), int(vim.eval('a:High')))

# using vim.command to export variable inside Python script to vim script so
# we can return its value in vim script
vim.command("let index = {}".format(idx))
EOF

return index
endfunction

纯Vim脚本

我提出的第二个函数使用纯Vim脚本:

function! RandInt(Low, High) abort
    let l:milisec = str2nr(matchstr(reltimestr(reltime()), '\v\.\zs\d+'))
    return l:milisec % (a:High - a:Low + 1) + a:Low
endfunction

如果你想生成非严重的场合随机数,你可以使用这两个函数作为首发。



文章来源: Native Vim Random number script
标签: random vim