Native Vim随机数脚本

时间:2012-10-05 00:38:06

标签: random vim

我知道有多种方法可以获取随机数,例如来自shell。但是,我在一部很少编译的Android手机上运行vim。而且,它不必是严格随机的。重点是,有趣的,简洁的还是快速的(即使用vim本机函数),还是在Vim中获得一系列相当好的随机数的简短方法?

3 个答案:

答案 0 :(得分:15)

尝试类似

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

。我知道没有更好的选择,然后使用一些时间函数(有两个:reltime()localtime(),但后者仅每秒更新一次)。我宁愿避免随机数或使用pyeval('random.randint(1, 10)')(前面有python import random),因为shell很慢而且我不相信基于时间的解决方案。

注意:文档说明reltime()返回的项目的格式取决于系统,因此我使用的是reltimestr(),而不是使用reltime()[1]做某事,如果它包含纳秒

答案 1 :(得分:8)

我最近自己玩过Vim脚本中的随机数字。以下是我在此过程中发现的一些资源。

没有Vim脚本

如果可以,请务必使用外部随机数生成器。通常,它们比在Vim脚本中可以完成的任何事情都更好,更快。

例如,尝试

  • :python import random; print random.randrange(1, 7)
  • :echo system('echo $RANDOM')
  • 另一种脚本语言for example Ruby

Vim脚本库。这些希望努力提供体面的RNG实施。

  • vital.vim 是由vim-jp用户组创建的优秀且全面的库。他们的随机数生成器具有令人印象深刻的功能,是我所知道的最好的纯Vim脚本RNG。 vital.vim使用Xorshift algorithm。看看吧!

    用vital.vim掷骰子:

    let Random = vital#of('vital').import('Random')
    echo Random.range(1, 7)
    
  • vim-rng 是一个小型随机数生成器插件。它导出了几个依赖于multiply-with-carry algorithm的全局函数。这个项目似乎正在进行中。

    用rng滚动模具:

    echo RandomNumber(1, 6)
    
  • magnum.vim 是我自己的小整数库。我最近添加了一个随机数生成器,可生成任意大小的整数。它使用XORSHIFT-ADD algorithm

    用magnum.vim滚动模具:

    let six = magnum#Int(6)
    echo magnum#random#NextInt(six).Add(magnum#ONE).Number()
    
  • Rndm 的存在时间比其他库长得多。它的功能作为一些全局功能公开。用Rndm滚动模具:

    echo Urndm(1, 6)
    

讨论和片段

最后,链接到深刻见解和Vim脚本片段。

  • ZyX's reltime snippet 在此页面上。

  • loreb的 vimprng project on GitHub 在Vim脚本中有大量的RNG实现。非常有用。

  • This old mailing list discussion有几个Vim脚本片段。 Bee-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
    
  • Another script,在名为Bart的个人配置文件中找到。

  • Episode 57 on Vimcasts.org 讨论Vim的'表达式寄存器',并始终引用随机数示例。请参阅此Stackoverflow问题和ZyX的代码段。推荐使用。

  • wikia上的Vim wiki有一篇文章'Jump to a random line',其中有一些资源尚未提及。

答案 2 :(得分:0)

根据他人的回答和互联网上的其他资源,我写了 两个函数来生成给定范围[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

如果要在非严重情况下生成随机数,可以使用 有两个功能可以作为启动器。