Solución:
Prueba algo como
function Rand()
return str2nr(matchstr(reltimestr(reltime()), 'v[email protected]<=d+')[1:])
endfunction
. No conozco mejor opción que usar algunas de las funciones de tiempo (hay dos de ellas: reltime()
y localtime()
, pero este último se actualiza solo cada segundo). Preferiría evitar los números aleatorios o usar pyeval('random.randint(1, 10)')
(precedido por python import random
), porque shell es lento y no confío en las soluciones basadas en el tiempo.
Nota: la documentación dice que el formato del artículo devuelto por reltime()
depende del sistema, por lo que estoy usando reltimestr()
, no haciendo algo con reltime()[1]
que parece que contiene nanosegundos.
Recientemente he jugado con números aleatorios en el script de Vim. Aquí hay algunos recursos que encontré en el proceso.
Sin secuencia de comandos de Vim
Por supuesto, use un generador externo de números aleatorios si puede. Como regla general, son mejores y más rápidos que cualquier cosa que se pueda hacer en el script de Vim.
Por ejemplo, intente
:python import random; print random.randrange(1, 7)
:echo system('echo $RANDOM')
- otro lenguaje de secuencias de comandos, por ejemplo Ruby
Bibliotecas
Bibliotecas de secuencias de comandos de Vim. Es de esperar que estos se esfuercen por proporcionar implementaciones de RNG de calidad decente.
-
vital.vim es una biblioteca excelente y completa creada por el grupo de usuarios vim-jp. Su generador de números aleatorios tiene una impresionante variedad de funcionalidades y es el mejor RNG de script Vim puro que conozco. vital.vim utiliza un algoritmo Xorshift. ¡Echale un vistazo!
Lanzar un dado con vital.vim:
let Random = vital#of('vital').import('Random') echo Random.range(1, 7)
-
vim-rng es un pequeño complemento generador de números aleatorios. Exporta un par de funciones globales que se basan en un algoritmo de multiplicar con acarreo. Este proyecto parece ser un trabajo en progreso.
Lanzar un dado con rng:
echo RandomNumber(1, 6)
-
magnum.vim es mi propia pequeña biblioteca de enteros. Recientemente agregué un generador de números aleatorios que genera números enteros de cualquier tamaño. Utiliza el algoritmo XORSHIFT-ADD.
Lanzar un dado con magnum.vim:
let six = magnum#Int(6) echo magnum#random#NextInt(six).Add(magnum#ONE).Number()
-
Rndm ha existido por mucho más tiempo que las otras bibliotecas. Su funcionalidad se expone como un par de funciones globales. Lanzar un dado con Rndm:
echo Urndm(1, 6)
Discusión y fragmentos
Finalmente, algunos enlaces a discusiones interesantes y fragmentos de script de Vim.
-
De ZyX
reltime
retazo en esta página. -
Loreb’s proyecto vimprng en GitHub tiene una cantidad impresionante de implementaciones de RNG en el script Vim. Muy útil.
-
Esta vieja discusión de la lista de correo tiene un par de fragmentos de secuencia de comandos de Vim. El primero dado por Bee-9 está limitado a 16 bits, pero lo encontré bastante efectivo. Aquí está:
let g:rnd = localtime() % 0x10000 function! Random(n) abort let g:rnd = (g:rnd * 31421 + 6927) % 0x10000 return g:rnd * a:n / 0x10000 endfunction
-
Otro script, que se encuentra en los archivos de configuración personales de una persona llamada Bart.
-
Episodio 57 en Vimcasts.org analiza el ‘registro de expresión’ de Vim y se refiere a ejemplos de números aleatorios en todo momento. Se refiere a esta pregunta de Stackoverflow y al fragmento de código de ZyX. Recomendado.
-
La wiki de Vim en wikia tiene un artículo ‘Saltar a una línea aleatoria’ que tiene algunos recursos que aún no se mencionan.