Chciałbym wygenerować jedną lub kilka liczb losowych oddzielonych nową linią.
Jak można to zrobić?
text-generation
kenorb
źródło
źródło
:python
?Odpowiedzi:
Nie ma do tego wbudowanej funkcji, więc musisz użyć czegoś zewnętrznego.
Powłoka UNIX (
/bin/sh
)Powołanie:
z
system()
jest dobrym sposobem. Możesz uzyskać tylko liczby, zastępująctr
jegrep
:Możesz użyć tego w Vimie tak:
Liczba 15 to liczba liczb, które chcesz (odpowiednio dostosuj). Powinno to działać w systemach Linux, BSD, OSX i innych systemach UNIX. To nie będzie działać na MS Windows.
Zobacz także mój post na blogu „ Generuj hasła z wiersza poleceń ” (istnieje wiele złych rozwiązań tego problemu).
Rubin
Ruby jest prawdopodobnie najlepszym wyborem, ponieważ skrypty Ruby wydają się być nieco bardziej popularne niż skrypty w języku Python. Uzyskanie losowej liczby jest łatwe:
Lub zdobyć 15 numerów:
Pyton
Możesz użyć losowego modułu; aby uzyskać pojedynczy numer:
Lub 15 liczb:
Powinno to działać zarówno w Pythonie 2, jak i 3.
Windows PowerShell
Możesz użyć,
Get-Random
aby uzyskać losową liczbę:Windows
cmd.exe
Windows 7 i nowsze wersje powinny być dostarczane z programem PowerShell, ale jeśli chcesz uzyskać maksymalną kompatybilność, możesz użyć
cmd.exe
. Ma specjalną zmienną%RANDOM%
:Uwaga: To nie jest bardzo losowe! , wykorzystuje czas (!)
Zauważ, że nie musisz używać powiązań Ruby lub Python, aby korzystać z rozwiązań Ruby lub Python; możesz także utworzyć osobny skrypt i wywołać go za pomocą
system("python -c '...'")
(oczywiście wymaga to zainstalowania Ruby / Pythona.źródło
tr -d '[:space:]'
, możetr -cd '[:digit:]'
dla filtra grep?:r! hexdump -n $((3*4)) -e '"%d"' /dev/urandom
Wygenerowałby 3 liczby całkowite ze znakiem losowym .:r! hexdump -n $((3*4)) -e '"\%d\n"' /dev/urandom
Oto czyste rozwiązanie vimscript . Nie stworzyłem go, opracował go Charles E. Campbell. Można znaleźć repo GitHub z jego kod tutaj .
Algorytm wykorzystuje 3 nasiona wygenerowane przy starcie Vima i generuje pseudolosową liczbę na podstawie obliczeń i permutacji zastosowanych do nasion:
Zakres zmiennych jest zadeklarowany jako globalny, ponieważ są używane przez funkcję generatora, ale może być ograniczony do skryptu (
s:
)A oto funkcja generatora:
Repozytorium obejmuje następujące funkcje:
Oto szybki test, który napisałem, aby przetestować generator: Wygenerowałem 1000000 liczb od 0 do 9 i policzyłem liczbę wystąpień każdej liczby tutaj są wyniki:
Jak widać, generacja wydaje się być dobrze rozproszona. Zdaję sobie sprawę, że w dużej mierze nie wystarcza to do przetestowania generatora losowego, więc spróbuję przeprowadzić dodatkową analizę, jeśli będę miał trochę wolnego czasu.
źródło
Jest to metoda znaleźć w vim-randomtag wtyczki, która jest oparta na czytanie ... aktualne w czasie mikrosekund, użyteczny gdy chcesz po prostu jakiś numer, nie przejmował się przypadkowości jakości lub wątpliwości związanych z bezpieczeństwem itp .:
źródło
Vim nie oferuje natywnego generatora losowego, jednak jeśli kompilujesz vima z Pythonem, następująca metoda doda losową cyfrę na końcu twojej linii:
Uwaga: Aby sprawdzić, czy Twój vim obsługuje Python, spróbuj:
:echo has('python')
(1 na yes).Możesz także użyć powłoki, która oferuje
$RANDOM
zmienną (działa z bash / ksh / zsh), która zwraca pseudolosowy (0-32767), na przykład:lub:
lub:
W systemie Windows musisz mieć zainstalowany Cygwin / MSYS / SUA lub użyć
%RANDOM%
zmiennej, jak sugeruje Carpetsmoker .Jeśli nie masz dostępu do powłoki i Pythona, tak jak w celu obejścia tego problemu, użyj kilku ostatnich cyfr z bieżącego znacznika czasu, na przykład:
Uwaga: Jeśli używasz go dość często, napisz prostą funkcję, która będzie
return reltimestr(reltime())[-4:]
.Aby dodać więcej liczb losowych, naciśnij, @:aby powtórzyć polecenie ponownie. Lub przedrostek z liczbą (podobną 10@:), aby dodać znacznie więcej liczb losowych oddzielonych nowymi wierszami.
Związane z:
źródło
zsh
, ale nie zsh
,dash
,fish
,csh
, lubtcsh
... można użyć:r! bash -c 'echo $RANDOM'
...GetRandom()
funkcji gdzie dobry PRNG robi sprawa, więc lepiej po prostu zrobić to dobrze od samego początku, jeśli to możliwe (i to prawie zawsze możliwe tutaj!)$RANDOM
, ale jeśli jest to zły PRNG, to nie jest powód, aby używać jeszcze gorszego PRNG :-) Zamiast tego, uaktualnij do lepszego PRNG! O ile mi wiadomo,/dev/urandom
jest dostępny na wszystkich platformach, na którychbash
jest powszechnie dostępny, więc nie widzę powodu, aby go nie używać.$RANDOM
. Wydaje się, że jest to bardzo miłe, małe narzędzie i chociaż może to być „biedny człowiek RNG” (jak wskazuje @Carpetsmoker), zdecydowanie pasuje do wymagania @ kenorb (który zadał pytanie) „łatwej do zapamiętania”.Możesz używać funkcji
rand()
isrand()
, pod warunkiem, że twój plik binarny Vim zawiera łatkę 8.1.2342 .Na przykład, aby wygenerować 10 liczb losowych oddzielonych znakami nowej linii:
Aby wygenerować 10 liczb losowych o wartości mniejszej niż 100:
Aby wygenerować 10 losowych ciągów alfabetycznych po 5 znaków:
Aby wygenerować 10 losowych słów (wziętych z pliku słownika
/usr/share/dict/words
):Aby wygenerować 10 sekwencji 5 losowych słów:
Aby wygenerować losowy UUID w wersji 4:
Aby zastosować losowy schemat kolorów:
źródło
Nie sądzę, żeby w Vimscript była natywna funkcja dla liczb losowych.
Sposób użycia
:python
(użyj go w funkcji, być może z 10000 i 60 zastąpionymi parametrami):Zobacz moją odpowiedź na temat tworzenia skrzynki w vimie przez Pythona, aby uzyskać szybkie wprowadzenie do skryptów Pythona w Vimie.
Ponieważ
vim.current.buffer
jest to lista ciągów, możemy przypisać do niej listę ciągów tak, jak w Pythonie.random.sample
to po prostu najprostszy sposób na uzyskanie listy losowych liczb całkowitych w Pythonie.źródło
random.sample
naprawia tylko dwa argumenty w Pythonie 2,str
jest wbudowaną funkcją do konwersji rzeczy na ciągi. Pozwól, że sprawdzę ekwiwalenty Py3 (str
byłoby to samo, będę musiał sprawdzićxrange
irandom.sample
).xrange
Nawias po 60 powinien być po 10000. Nie ma go w Python3, ponieważrange
jest równoważny (w rzeczywistości żaden nie tworzy listy, w przeciwieństwierange
do Py2).map
w Py3 zwraca iterowalną, a nie listę, więc użyje ostatniej liniilist(map(str, random.sample(range(10000), 60)))