【问题标题】:Native Vim Random number script本机 Vim 随机数脚本
【发布时间】:2012-09-26 02:54:51
【问题描述】:

我知道有多种方法可以获取随机数,例如从 shell 中获取。但是,我在很少编译的 android 手机上运行 vim。此外,它不必是严格随机的。关键是,在 Vim 中获得一系列相当好的随机数的有趣、简洁、快速(即使用 vim 原生函数)或快捷方式是什么?

【问题讨论】:

  • 与 vi.stackexchange.com 上的this post 相关

标签: random vim


【解决方案1】:

试试类似的东西

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] 做某事,看起来它包含纳秒。

【讨论】:

  • 当然!我知道 reltime,但认为它“不够随机”。但它似乎给出了一个很好的、统一的分布。我试图用预先生成的随机表做一些事情,但我找不到一种快速简单的方法。
  • 确实这还不够随机。当值低于 10 时,我检查了该代码最后 2 个数字的输出 1000 次。结果如下: 00= 20 , 01= 29, 02= 63, 03= 88, 04=104, 05=126, 06=152, 07=123, 08=153, 09=142 (第一个值 = 最后 2 个数字,最后一个值 = nr. 出现的次数。从 05 到 09 的值比从 01 到05
  • @Remonn 因为任何基于时间的解决方案都取决于您的系统。在我的系统上分布是统一的:pastebin.com/gB1bvGw6.
  • @ZyX,嗨 ZyX,是的,我就是这么做的。这是我的代码:for i in range(1,1000) | let newrandom = str2nr(localtime) | while | matchstr(newrandom, '\d\d$') &gt; 9 | let newrandom= str2nr(localtime) | endwhile | put=newrandom | endfor
  • @Remonn 那里有system() 函数。
【解决方案2】:

我最近自己玩过 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)
    

讨论和sn-ps

最后,一些有见地的讨论和 Vim 脚本 sn-ps 的链接。

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

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

  • This old mailing list discussion 有几个 Vim 脚本 sn-ps。 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 的“表达式寄存器”,并始终引用随机数示例。参考this Stackoverflow question和ZyX的sn-p。推荐。

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

【讨论】:

  • Another script 的链接现在已损坏。
【解决方案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

使用luaeval()仅限Neovim

第三种生成随机数的方法是通过luaeval()使用lua。

" math.randomseed() is need to make the random() function generate different numbers 
" on each use. Otherwise, the first number it generate seems same all the time.
luaeval('math.randomseed(os.time())')
let num = luaeval('math.random(1, 10)')

如果你想在非严重场合生成随机数,你可以使用 这些方法作为入门。

【讨论】:

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