Я знаю, что существуют различные способы получить случайные числа, например, из оболочки. Тем не менее, я запускаю vim на Android-телефоне с очень небольшим количеством компиляции. Кроме того, он не должен быть строго случайным. Дело в том, что интересное, или краткое, или быстрое (то есть с собственными функциями vim), или короткий способ получить последовательность достаточно хороших случайных чисел в Vim?
Native Vim Случайное число script
Ответ 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
Если вы хотите генерировать случайное число в несерьезных случаях, вы можете использовать две функции в качестве стартового.