Yanıtlar:
Bunun için yerleşik bir tesis bulunmadığından harici bir şey kullanmanız gerekir.
/bin/sh
)Arayan:
strings -n 1 < /dev/urandom | tr -d '[:space:]' | head -c15
ile system()
iyi bir yoldur. Sen değiştirerek yalnızca rakamlardan alabilirsiniz tr
ile grep
:
strings -n 1 < /dev/urandom | grep -o '[[:digit:]]' | head -c15
Bunu Vim'de şu şekilde kullanabilirsiniz:
:echo system("strings -n 1 < /dev/urandom | grep -o '[[:digit:]]' | head -c15")
15 sayısı, istediğiniz sayı miktarıdır (buna göre ayarlayın). Bu Linux, BSD, OSX ve diğer UNIX sistemlerinde çalışmalıdır. MS Windows'ta çalışmaz.
Ayrıca " Komut satırından şifreleri oluştur " web günlüğüme bakın (bunun için birçok kötü çözüm var).
Ruby muhtemelen bir sonraki en iyi seçimdir, çünkü Ruby scriptleri Python scriptlerinden biraz daha yaygın görünmektedir. Rasgele bir sayı elde etmek kolaydır:
:ruby puts Random.rand(10)
Veya 15 numara almak için:
:ruby 15.times { puts Random.rand(10) }
Rasgele modülü kullanabilirsiniz ; Tek bir numara almak için:
:py import random; print(random.randint(0, 9))
Veya 15 numara:
:py import random
:py for i in range(0, 15): print(random.randint(0, 9))
Bu, hem Python 2 & 3 için çalışmalı.
Get-Random
Rasgele bir sayı almak için kullanabilirsiniz :
:echo system('Get-Random')
cmd.exe
Windows 7 ve sonraki sürümleri PowerShell ile birlikte gönderilmelidir, ancak maksimum uyumluluk istiyorsanız, kullanabilirsiniz cmd.exe
. Özel bir değişkeni var %RANDOM%
:
:echo system('@echo %RANDOM%')
Not: Bu çok rastgele değil! , zaman kullanır (!)
Ruby veya Python çözümlerini kullanmak için Ruby veya Python ciltlerini kullanmanız gerekmediğini unutmayın; Ayrıca ayrı bir komut dosyası oluşturabilir ve bunları arayabilir
system("python -c '...'")
(bu ruby / python'un yüklü olduğunu gerektirir).
tr -d '[:space:]'
, belki tr -cd '[:digit:]'
grep filtresi için?
:r! hexdump -n $((3*4)) -e '"%d"' /dev/urandom
3 rastgele işaretlenmiş tam sayı üretebilir.
:r! hexdump -n $((3*4)) -e '"\%d\n"' /dev/urandom
İşte saf bir vimscript çözümü. Yaratmadım, Charles E. Campbell tarafından geliştirildi. Burada Github deposunu koduyla birlikte bulabilirsiniz .
Algoritma, Vim başlangıcında üretilen 3 tohum kullanır ve tohumlara uygulanan hesaplamaları ve permütasyonları temel alan sahte rastgele bir sayı üretir:
" Randomization Variables
" with a little extra randomized start from localtime()
let g:rndm_m1 = 32007779 + (localtime()%100 - 50)
let g:rndm_m2 = 23717810 + (localtime()/86400)%100
let g:rndm_m3 = 52636370 + (localtime()/3600)%100
Değişkenler kapsamı global olarak bildirilir, çünkü bunlar jeneratör işlevi tarafından kullanılırlar, ancak komut dosyası ( s:
) ile sınırlandırılabilirler.
Ve işte jeneratör işlevi:
function! Rndm()
let m4= g:rndm_m1 + g:rndm_m2 + g:rndm_m3
if( g:rndm_m2 < 50000000 )
let m4= m4 + 1357
endif
if( m4 >= 100000000 )
let m4= m4 - 100000000
if( m4 >= 100000000 )
let m4= m4 - 100000000
endif
endif
let g:rndm_m1 = g:rndm_m2
let g:rndm_m2 = g:rndm_m3
let g:rndm_m3 = m4
return g:rndm_m3
endfun
Depo aşağıdaki işlevleri içerir:
Jeneratörü test etmek için yazdığım hızlı bir test: 0 ile 9 arasında 1000000 sayı ürettim ve her sayının oluşum sayısını saydım.
0 : 100409
1 : 99435
2 : 100433
3 : 99578
4 : 100484
5 : 99948
6 : 100394
7 : 99649
8 : 99803
9 : 99867
Gördüğünüz gibi nesiller iyi dağılmış gibi görünüyor. Bunun rastgele bir oluşturucuyu test etmek için yeterli olmadığının farkındayım, bu yüzden biraz boş zamanım varsa ekstra analiz yapmaya çalışacağım.
Bu, vim-randomtag eklentisinde bulunan ve şu anki mikrosaniye okumaya dayanan, sadece bir sayıyı istediğinizde kullanabileceğiniz , rastgelelik kalitesi ile ilgilenmediğiniz veya güvenlik kaygılarınız vb. İle ilgilenmediğiniz bir yöntemdir.
function! s:randnum(max) abort
return str2nr(matchstr(reltimestr(reltime()), '\v\.@<=\d+')[1:]) % a:max
endfunction
Vim yerel rastgele üreteci sunmuyor, ancak Python ile derlenmiş bir vim kullanıyorsanız, aşağıdaki yöntem satırınızın sonuna rastgele bir rakam ekleyecektir:
:py import vim, random; vim.current.line += str(random.randint(0, 9))
Not: Vim'inizin Python'u destekleyip desteklemediğini kontrol etmek için şunları deneyin: :echo has('python')
(evet için 1).
Bir $RANDOM
değişken (örneğin bash / ksh / zsh ile birlikte çalışan) bir takma ad (0-32767) döndüren kabuk sunan da kullanabilirsiniz :
:r! echo $RANDOM
veya:
:put =system('echo $RANDOM')
veya:
:r! od -An -td -N1 /dev/urandom
Windows'ta, Cygwin / MSYS / SUA'nın kurulu olması veya Carpetsmoker'in önerdiği şekilde %RANDOM%
değişken kullanmanız gerekir .
Kabuk ve Python'a erişiminiz yoksa, geçici çözüm için olduğu gibi, geçerli zaman damgasındaki son birkaç basamağı kullanırsınız, örneğin:
:put =reltimestr(reltime())[-2:]
Not: Çok sık kullanıyorsanız, olacak basit bir fonksiyon yazın return reltimestr(reltime())[-4:]
.
Not: Yukarıdaki yöntemlerde yalnızca bir şifreleme anahtarı oluşturmak için kullanılmaması gereken bir sahte tamsayı döndürülür.
Daha fazla rasgele numara eklemek için, lütfen @:komutu tekrarlamak için basın . Veya 10@:yeni satırlarla ayrılan çok daha fazla rasgele sayı eklemek için sayı (benzeri ) ile ön ek girin .
İlgili:
zsh
, ancak birlikte sh
, dash
, fish
, csh
, veya tcsh
... Sen kullanabilirsiniz :r! bash -c 'echo $RANDOM'
...
GetRandom()
iyi prng işlevini yapar sadece başından mümkünse onu almak daha iyidir, böylece madde (ve burada hemen hemen her zaman mümkündür!)
$RANDOM
, ama eğer bu zayıf bir PRNG ise, o zaman daha da zayıf bir PRNG kullanmak için bir neden değildir :-) Bunun yerine, daha iyi bir PRNG'ye yükseltin! Gibi bildiğim kadarıyla, /dev/urandom
bütün platformlarda kullanılabilir bash
ı için bir neden görmüyorum bu yüzden, yaygın kullanılabilir değil kullanabilirsiniz.
$RANDOM
. Çok hoş küçük bir araç gibi görünüyor ve bir "fakir adamın RNG'si" olsa bile (@Carpetsmoker'ın işaret ettiği gibi), kesinlikle "kenorb'un (soruyu soran)" kolayca unutulmaz "şartına uyuyor.
Vim binary'inizin 8.1.2342 yamasını içermesi koşuluyla rand()
ve srand()
işlevlerini kullanabilirsiniz .
Örnek olarak, yeni satırlarla ayrılmış 10 rasgele sayı oluşturmak için:
let seed = srand()
echo range(10)->map({-> rand(g:seed)})->join("\n")
100'den aşağı 10 rasgele sayı üretmek için:
let seed = srand()
echo range(10)->map({-> rand(g:seed) % 100})->join("\n")
5 karakterden oluşan 10 rasgele alfabetik dizge oluşturmak için:
let seed = srand()
echo range(10)
\ ->map({-> range(5)
\ ->map({-> (97+rand(g:seed) % 26)->nr2char()})->join('')})
\ ->join("\n")
10 rastgele kelime üretmek için (sözlük dosyasından alınmıştır /usr/share/dict/words
):
let seed = srand()
let words = readfile('/usr/share/dict/words')
let len = len(words)
echo range(10)->map({-> g:words[rand(g:seed) % g:len]})->join("\n")
5 rastgele sözcüğün 10 dizisini oluşturmak için:
let seed = srand()
let words = readfile('/usr/share/dict/words')
let len = len(words)
echo range(10)
\ ->map({-> range(5)
\ ->map({-> g:words[rand(g:seed) % g:len]})->join()})
\ ->join("\n")
Rasgele bir UUID sürüm 4 oluşturmak için:
" Based on this answer: /programming//a/38191078/9780968
let seed = srand()
let random_numbers = range(30)->map({-> rand(g:seed) % 16})
echo call('printf', ['%x%x%x%x%x%x%x%x-%x%x%x%x-4%x%x%x'] + random_numbers[:14])
\ ..call('printf', ['-X%x%x%x-%x%x%x%x%x%x%x%x%x%x%x%x'] + random_numbers[15:])
\ ->substitute('X', '89ab'[rand(seed) % 4], '')
Rasgele bir renk şeması uygulamak için:
let seed = srand()
let colorschemes = getcompletion('', 'color')
let len = colorschemes->len()
exe 'colo '..colorschemes[rand(seed) % len]
Vimscript'te rastgele sayılar için yerel bir işlev olduğunu sanmıyorum.
Kullanmanın bir yolu :python
(belki 10000 ve 60 ile değiştirilen bir fonksiyonda kullanın):
:python <<EOF
import vim
import random
line = vim.current.window.cursor[0]
r = getattr(__builtins__, 'xrange', range) # To make it work for both Python 2 & 3
vim.current.buffer[line:line] = list(map(str, random.sample(r(10000), 60)))
EOF
Vim'deki Python komut dizisine hızlı bir giriş yapmak için, Vim'deki bir kutu python aracılığıyla yapma konusundaki cevabımı görün .
Yana vim.current.buffer
dizeleri listesidir, biz buna Python'da açar gibi dizeleri listesini atayabilirsiniz. random.sample
Python'da rastgele tamsayıların listesini almak için düşünebildiğim en basit yol.
random.sample
, Python 2'deki sadece iki argümanı onarır, str
şeyleri dizgelere dönüştüren yerleşik işlevdir. Py3 eşdeğerlerini aramama izin ver ( str
aynı olurdu, kontrol etmek zorunda kalacak xrange
ve random.sample
).
xrange
Python3'te değildir, çünkü range
eşdeğerdir (aslında range
Py2'dekilerin aksine bir liste de oluşturmaz).
map
Py3'te yinelenebilir ve bir liste değil, son satırın kullanmasıdırlist(map(str, random.sample(range(10000), 60)))
:python
?