Saya ingin menghasilkan satu atau beberapa angka acak yang dipisahkan oleh baris baru.
Bagaimana ini bisa dilakukan?
text-generation
kenorb
sumber
sumber
:python
?Jawaban:
Tidak ada fasilitas bawaan untuk ini, jadi Anda harus menggunakan sesuatu yang eksternal.
UNIX Shell (
/bin/sh
)Panggilan:
dengan
system()
adalah cara yang baik. Anda hanya bisa mendapatkan nomor dengan menggantitr
dengangrep
:Anda dapat menggunakan ini di Vim seperti:
Angka 15 adalah jumlah angka yang Anda inginkan (sesuaikan sesuai). Ini harus bekerja pada Linux, BSD, OSX, dan sistem UNIX lainnya. Itu tidak akan berfungsi pada MS Windows.
Juga lihat posting weblog saya " Hasilkan kata sandi dari commandline " (ada banyak solusi buruk untuk ini di luar sana).
Rubi
Ruby mungkin adalah pilihan terbaik berikutnya, karena scripting Ruby tampaknya sedikit lebih umum daripada scripting Python. Mendapatkan nomor acak itu mudah:
Atau untuk mendapatkan 15 nomor:
Python
Anda dapat menggunakan modul acak ; untuk mendapatkan satu nomor:
Atau 15 angka:
Ini seharusnya bekerja untuk Python 2 & 3.
Windows PowerShell
Anda dapat menggunakan
Get-Random
untuk mendapatkan nomor acak:Windows
cmd.exe
Windows 7 dan yang lebih baru harus dikirim dengan PowerShell, tetapi jika Anda ingin kompatibilitas maksimum Anda dapat menggunakan
cmd.exe
. Ini memiliki variabel khusus%RANDOM%
:Catatan: Ini tidak terlalu acak! , ini menggunakan waktu (!)
Perhatikan bahwa Anda tidak perlu menggunakan ikatan Ruby atau Python untuk menggunakan solusi Ruby atau Python; Anda juga dapat membuat skrip terpisah dan memanggil mereka dengan
system("python -c '...'")
(ini memang mengharuskan ruby / python diinstal, jelas.sumber
tr -d '[:space:]'
, mungkintr -cd '[:digit:]'
untuk filter grep?:r! hexdump -n $((3*4)) -e '"%d"' /dev/urandom
, akan menghasilkan 3 bilangan bulat yang ditandatangani secara acak.:r! hexdump -n $((3*4)) -e '"\%d\n"' /dev/urandom
Berikut ini adalah solusi vimscript murni . Saya tidak membuatnya, ini dikembangkan oleh Charles E. Campbell. Anda dapat menemukan repo Github dengan kode-nya di sini .
Algoritme menggunakan 3 biji yang dihasilkan pada startup Vim dan menghasilkan angka pseudo-acak berdasarkan perhitungan dan permutasi yang diterapkan pada biji:
Ruang lingkup variabel dinyatakan sebagai global karena mereka digunakan oleh fungsi generator tetapi bisa dibatasi untuk skrip (
s:
)Dan di sini adalah fungsi generator:
Repo mencakup fungsi-fungsi berikut:
Berikut ini adalah tes cepat yang saya tulis untuk menguji generator: Saya menghasilkan 10.00000 angka antara 0 dan 9 dan menghitung jumlah kemunculan setiap angka di sini adalah hasilnya:
Seperti yang Anda lihat, generasi tampaknya terdistribusi dengan baik. Saya sadar bahwa ini sebagian besar tidak cukup untuk menguji generator acak jadi saya akan mencoba membuat beberapa analisis tambahan jika saya punya waktu luang.
sumber
Ini adalah metode yang ditemukan dalam plugin vim-randomtag , yang didasarkan pada pembacaan ... mikrodetik waktu saat ini, dapat digunakan ketika Anda hanya menginginkan beberapa nomor, Anda tidak terlalu peduli tentang kualitas keacakan, atau memiliki masalah keamanan dll .:
sumber
Vim tidak menawarkan generator acak asli, namun jika Anda memiliki vim yang dikompilasi dengan Python, metode berikut ini akan menambahkan digit acak di akhir baris Anda:
Catatan: Untuk memeriksa apakah vim Anda mendukung Python, coba:
:echo has('python')
(1 untuk ya).Anda juga dapat menggunakan shell yang menawarkan
$RANDOM
variabel (berfungsi dengan bash / ksh / zsh) yang mengembalikan pseudorandom (0-32767), misalnya:atau:
atau:
Di Windows, Anda harus menginstal Cygwin / MSYS / SUA, atau menggunakan
%RANDOM%
variabel seperti yang disarankan Carpetsmoker .Jika Anda tidak memiliki akses ke shell dan Python, seperti untuk penyelesaiannya, Anda menggunakan beberapa digit terakhir dari cap waktu saat ini, misalnya:
Catatan: Jika Anda cukup sering menggunakannya, tulislah fungsi sederhana yang akan
return reltimestr(reltime())[-4:]
.Untuk menambahkan lebih banyak angka acak, silakan tekan @:untuk mengulangi perintah lagi. Atau awalan dengan angka (seperti 10@:) untuk menambahkan lebih banyak angka acak yang dipisahkan oleh baris baru.
Terkait:
sumber
zsh
, tetapi tidak dengansh
,dash
,fish
,csh
, atautcsh
... Anda bisa menggunakan:r! bash -c 'echo $RANDOM'
...GetRandom()
fungsi Anda di mana prng yang baik itu penting, jadi lebih baik untuk melakukannya dengan benar dari awal jika memungkinkan (dan hampir selalu memungkinkan di sini!)$RANDOM
, tetapi jika ini adalah PRNG yang buruk maka itu bukan alasan untuk menggunakan PRNG yang lebih buruk :-) Sebaliknya, tingkatkan ke PRNG yang lebih baik! Sejauh yang saya tahu,/dev/urandom
tersedia di semua platform di manabash
biasanya tersedia, jadi saya tidak melihat alasan untuk tidak menggunakannya.$RANDOM
. Sepertinya alat kecil yang sangat bagus, dan meskipun itu mungkin "orang miskin RNG" (seperti yang ditunjukkan oleh @Carpetsmoker), itu pasti cocok dengan persyaratan @ kenorb (yang mengajukan pertanyaan) persyaratan "mudah diingat".Anda dapat menggunakan
rand()
dansrand()
fungsinya, asalkan biner Vim Anda menyertakan tambalan 8.1.2342 .Sebagai contoh, untuk menghasilkan 10 angka acak yang dipisahkan oleh baris baru:
Untuk menghasilkan 10 angka acak, semua lebih rendah dari 100:
Untuk menghasilkan 10 string alfabet acak dengan 5 karakter:
Untuk menghasilkan 10 kata acak (diambil dari file kamus
/usr/share/dict/words
):Untuk menghasilkan 10 urutan 5 kata acak:
Untuk menghasilkan UUID versi 4 acak:
Untuk menerapkan skema warna acak:
sumber
Saya tidak berpikir ada fungsi asli untuk angka acak di Vimscript.
Cara menggunakan
:python
(menggunakannya dalam suatu fungsi, mungkin, dengan 10000 dan 60 diganti dengan parameter):Lihat jawaban saya untuk Membuat kotak dalam vim melalui python untuk intro cepat tentang skrip Python di Vim.
Karena
vim.current.buffer
ini adalah daftar string, kita bisa menetapkan daftar string seperti yang kita lakukan dengan Python.random.sample
hanyalah cara paling sederhana yang dapat saya pikirkan untuk mendapatkan daftar bilangan bulat acak dengan Python.sumber
random.sample
hanya mengulangi dua argumen pada Python 2,str
adalah fungsi bawaan untuk mengubah berbagai hal menjadi string. Biarkan saya mencari yang setara dengan Py3 (str
akan sama, harus memeriksaxrange
danrandom.sample
).xrange
tidak dalam Python3 karenarange
sama (tidak benar-benar membangun daftar, tidak sepertirange
dalam Py2).map
dalam Py3 mengembalikan iterable dan bukan daftar, jadi baris terakhir akan menggunakanlist(map(str, random.sample(range(10000), 60)))