Подтвердить что ты не робот

Native Vim Случайное число script

Я знаю, что существуют различные способы получить случайные числа, например, из оболочки. Тем не менее, я запускаю vim на Android-телефоне с очень небольшим количеством компиляции. Кроме того, он не должен быть строго случайным. Дело в том, что интересное, или краткое, или быстрое (то есть с собственными функциями vim), или короткий способ получить последовательность достаточно хороших случайных чисел в Vim?

4b9b3361

Ответ 1

Попробуйте что-нибудь вроде

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

. Я не знаю лучшего варианта, используя некоторые функции времени (их два: reltime() и localtime(), но последние обновляются только каждую секунду). Я бы предпочел либо избегать случайных чисел, либо использовать pyeval('random.randint(1, 10)') (которому предшествует python import random), потому что оболочка медленная, и я не доверяю временным решениям.

Примечание: документация говорит о том, что формат элемента, возвращаемого reltime(), зависит от системы, поэтому я использую reltimestr(), не делая что-то с reltime()[1], который выглядит, если он содержит наносекунды.

Ответ 2

Я недавно играл со случайными числами в Vim script. Вот некоторые ресурсы, которые я нашел в процессе.

Нет Vim script

Во всяком случае, используйте генератор случайных чисел, если сможете. Как правило, они лучше и быстрее, чем все, что можно было сделать в Vim script.

Например, попробуйте

  • :python import random; print random.randrange(1, 7)
  • :echo system('echo $RANDOM')
  • другой язык сценариев, например Ruby

Библиотеки

Vim script. Они, надеюсь, стремятся обеспечить достойные качества реализации РНГ.

  • vital.vim - отличная и полная библиотека, созданная группой пользователей vim-jp, Их генератор случайных чисел обладает внушительным набором функций и является лучшим чистым Vim script RNG, о котором я знаю. vital.vim использует алгоритм Xorshift. Проверьте это!

    Перемещение штампа с виталом. 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 script.

  • ZyX reltime фрагмент на этой странице.

  • loreb проект vimprng на GitHub имеет внушительное количество реализаций RNG в Vim script, Очень полезно.

  • Этот старый список рассылки содержит несколько фрагментов Vim script. Первый, данный 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
    
  • Другой script, найденный у человека с персональными конфигурационными файлами Bart.

  • Эпизод 57 на Vimcasts.org обсуждает регистр экспрессии Vim 'и ссылается на случайное число примеры повсюду. Относится к этому вопросу Stackoverflow и фрагменту ZyX. Рекомендуется.

  • В вики Vim на wikia есть статья "Перейти к случайной строке" , в которой есть несколько ресурсов, которые еще не упомянуты.

Ответ 3

Основываясь на ответах других и других ресурсах из Интернета, я написал две функции для генерации случайного целого числа в заданном диапазоне [Low, High].

Обе функции получают два аргумента: Low и High и возвращают случайное число в этом диапазоне.

Объединить 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

Pure 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

Если вы хотите генерировать случайное число в несерьезных случаях, вы можете использовать две функции в качестве стартового.