Tantangan
Diberikan bilangan bulat positif (K)
Output bilangan bulat seragam acak (Y)
antara [0, K)
.
Jika Y > 0
Asumsikan K = Y
dan ulangi prosesnya sampai Y = 0
.
Aturan
- Masukan harus dicetak terlebih dahulu
- Format output sesuai keinginan
- Program Anda harus selesai.
0
harus menjadi hasil akhir, sebagai gantinya opsional baris kosong0
Jawaban:
Pyth ,
6 54 byteCoba di sini!
Bagaimana itu bekerja
sumber
C (gcc) , 42 byte
Cobalah online!
Menggunakan hubung singkat dan logis.
C (gcc) , 40 byte (tanpa mencetak nilai awal)
Cobalah online!
Menggunakan hubung singkat dan logis.
sumber
rand()%_
tidak seragamR ,
66 60 56 4341 byteCobalah online!
sumber
>0
dancat(n,"")
(string kosong) juga akan berfungsi.print
lebih efisien di sini, karena mengembalikan argumennya: 56 bytek=scan();while(x<-sample(1:k-1,1))k=c(x,k);cat(rev(k),0)
n=scan();while(print(n))n=sample(n,1)-1
MATL , 6 byte
Cobalah online!
Penjelasan
sumber
Pepe , 25 byte
Pepe adalah bahasa pemrograman yang dibuat oleh pengguna Soaku .
Cobalah online!
Penjelasan:
sumber
Perl 6 , 18 byte
Cobalah online!
Blok kode anonim yang mengembalikan daftar nilai. Jika Anda tidak keberatan angkanya berkisar, Anda dapat melakukan:
selama 17 byte. Lucunya, fungsi acak builtin lain
roll
,, memiliki perilaku yang sama dalam hal ini untuk jumlah byte yang sama.sumber
Perl 5 .10.0
-pl
, 26 byteCobalah online!
sumber
Jelly ,
43 byteIni adalah tautan monadik (fungsi) yang mencetak array dan mengembalikan 0 .
Cobalah online!
Bagaimana itu bekerja
sumber
Brachylog , 8 byte
Cobalah online!
Penjelasan
Rekursi akan berhenti setelah
?ℕ₁
gagal, yaitu saat input0
.sumber
05AB1E ,
87 byteCobalah online!
Penjelasan
sumber
Δ=ݨΩ0M
setara.J, 13 byte
Di kereta bawah tanah, jadi minta maaf karena kurangnya TIO (mudah-mudahan tidak ada kekurangan kebenaran).
Menghasilkan daftar nilai.
Agaknya pendekatan APL akan lebih pendek, tetapi inilah yang saya pikirkan.
Bagaimana itu bekerja
^:a:
terapkan berulang kali hingga konvergensi, menyimpan hasil antara dalam array.?
integer acak dalam kisaran[0, K)
untukK
lebih besar dari 0. Untuk 0, itu memberikan integer acak dalam kisaran(0,1)
. Untuk angka floating point, kesalahan.::]
menangkap kesalahan untuk input?
dan bukannya kesalahan , output input yang menyebabkan kesalahan.}:
singkirkan nilai terakhir dalam array (ini adalah agar angka floating point bukan output).Cobalah online!
sumber
?.
, tapi saya rasa saya tidak menggunakannya.JavaScript (ES6),
3837 byte-1 byte terima kasih kepada @Arnauld
Tampilkan cuplikan kode
sumber
new Date%n
tidak benar-benar berfungsi di sini, karena itu tidak berubah cukup cepat untuk menjadi berguna untuk menghasilkan beberapa nomor acakC, 38 byte
Cobalah online
Tidak disatukan
sumber
&&
; juga, Anda mungkin ingin mempertimbangkan untuk menaburkan RNG dimain
fungsi Anda : Cobalah online!Pyth , 4 byte
Cobalah online!
Ini pada dasarnya mengimplementasikan algoritma:
To translate the Pyth into the algorithm, we can mostly just examine what each character means. Since Pyth is written in prefix notation (i.e.
* + 1 2 3
is(1 + 2) * 3
) we can start from the left and fill in the arguments as we go.W
memulai loop sementara tradisional. Pernyataan pertama setelah itu adalah kondisi loop dan pernyataan kedua setelah itu adalah loop body. Jika pernyataan kedua kosong itu menjadi no-op . Ini sementara bekerja persis seperti Python sementara, sehingga akan mengevaluasi bilangan bulat bukan nol sebagai Benar dan nol sebagai salah.Pernyataan pertama setelah beberapa saat dimulai dengan karakter baris baru. Ini sesuai dengan fungsi "cetak dan kembali dengan baris baru" Pyth. Ini membutuhkan satu argumen, yang kemudian dicetak dan juga dikembalikan tanpa dimodifikasi. Ini memungkinkan kami untuk mencetak langkah-langkah perantara sambil juga melakukan operasi yang diperlukan.
Argumen yang diteruskan ke fungsi cetak ini dimulai dengan
~
yang agak spesial. Jika karakter segera setelah~
variabel, dibutuhkan dua argumen, jika tidak maka diperlukan satu. KarenaO
bukan variabel~
akan mengkonsumsi hanya satu argumen.~
fungsi sedikit seperti+=
tidak dalam banyak bahasa konvensional, meskipun operator terdekat akan menjadi operator pasca-kenaikan++
dariC
. Anda mungkin tahu itux++
akan seperti menggunakanx
sebagai nilai saat ini, tetapi sesudahnyax
akan seperti itux+1
.~
adalah ide yang sama, tetapi digeneralisasi untuk apa pun hasil dari argumen pertama. Bagaimana cara memilih variabel yang akan ditugaskan akan dibahas nanti.Argumennya
~
adalahO
yang sangat sederhana. Ketika satu argumennya adalah bilangan bulatO
mengembalikan nilai dari 0 menjadi kurang dari integer itu secara acak.Sekarang Anda mungkin telah memperhatikan
O
tidak memiliki argumen. Di sini penerjemah Pyth dengan baik mengisi duga, yang di sini adalah variabelQ
.Q
memiliki arti khusus dalam Pyth: setiap kali ada dalam suatu program, program Pyth dimulai dengan menugaskanQ
input dari program. Karena ini adalah variabel pertama yang terjadi dalam~
argumenQ
juga sekarang variabel yang~
akan memberikan nilai.Ringkas program "dapat dibaca" kami mungkin terlihat seperti:
Dan satu sampel "run-through" mungkin terlihat seperti:
O
mengembalikan 3,~
mengembalikan 5,\n
mengembalikan dan mencetak 5 yang benarO
mengembalikan 0,~
mengembalikan 3,\n
mengembalikan dan mencetak 3 yang benarO
mengembalikan sesuatu yang tidak relevan,~
mengembalikan 0,\n
mengembalikan dan mencetak 0 yang salahsumber
APL (Dyalog Unicode) ,
129 byteFungsi awalan diam-diam anonim. Diasumsikan
⎕IO
( I ndex O rigin)0
, yang merupakan default pada banyak sistem. Mengembalikan nilai akhir (0) selain mencetak saat dijalankan.Cobalah online!
{
...}⍣=
terapkan fungsi berikut sampai stabil:⎕←⍵
Keluarkan argumen?
mengembalikan nomor acak yang terdistribusi secara merata dalam kisaran 0 hingga -1⌊
round down (karena?0
memberikan (0,1) float)sumber
C (gcc),
4042 bytesSome idiot™ forgot to print the initial value first.
Don't panic.
sumber
f(K){while(K)printf("%d\n",K),K=rand()%K;}
. Still you got my +1 for an equal solution!f(K){while(K)printf("%d\n",K,K=rand()%K);}
x86 + rdrand, 19 bytes
Straightforward implementation. Takes input K in
ecx
and outputs to a buffer inebx
.sumber
Python 3, 39 bytes
Probably not the most cryptographically secure random number generator but to the human eye it looks random enough...
Try it online!
sumber
k=0
is acceptable.hash()
tries to maintain but doesn't guarantee this property. For that task you should use therandom
module.random.randrange()
:from random import*;f=lambda k:print(k)or f(randrange(k))
TI-Basic (TI-84 Plus CE),
1713 bytes-4 bytes from Misha Lavrov
Takes input in
Ans
as50:prgmNAME
.TI-Basic is a tokenized language. All tokens used here are one byte.
Explanation:
An 11-byte solution suggested by Misha Lavrov that requires pressing
enter
after each line following the first.sumber
int(Ansrand
is shorter. Also, usingPause
instead ofDisp
, you can make the only statement in the loop bePause int(Ansrand
, which also updatesAns
.Python 2,
646260 bytesTry it online!
Saved
sumber
while 1:print k;k=randint(0,~-k)
should work (with an error at the end)while 1:print k;k=randrange(k)
saves two.C++ (gcc), 98 bytes
Try it here!
Usage
This is my first code golf attempt. Any feedback or remarks are welcome.
Edit: Removed the main function as suggested to make it valid.
sumber
-Dd='printf("%i,",x'
instead of the#define
would save you some bytes (-4), and is allowed as long as you count the bytes towards your result (because it is a non-standard preprocessor directive. You can also leave out the imports (at least with-std=c++98
and-w
, which don't count for bytes), and the variable types. So, you'd havep(x){d);while(x>0)d=rand()%x;}
and-Dd='printf("%i,",x'
.><>, 92+2 Bytes
+2B for -v flag
Try it online!
><>'s only source of randomness comes from the 'x' instruction, which sets the instruction pointer's direction to a random value. As such, generating a random number from 0 to n isn't trivial.
I first calculate how many bits are required to represent a number in the range [0,n), then generate random bits to generate a random number. This leaves the possibility that it'll generate a number slightly larger than n, in which case we just discard it and try again.
Explanation:
sumber
MATLAB (
4946 bytes)Sample output:
sumber
k=randi(k)-1
for a few bytes less.Retina, 21 bytes
Try it online! Explanation:
Repeat until the value stops changing (i.e. 0).
Print the value before each pass through the loop.
Convert to unary.
Create the range and convert to decimal.
Pick a random element.
sumber
Pyth,
67 bytesTry it online!
+1 to print the initial input value.
While Q is truthy, set Q to be a random integer between 0 and Q and print Q.
Not the shortest Pyth answer but I'm just learning and only posting because of the recent discussion about no-one using Pyth any more :)
sumber
=
and~
use the first variable of an expression as the variable that will be assigned if one isn't specified. For example~hT
will setT
to 11 while returning 10. The only other fancy trick is that the newline character prints its input and then returns that value unmodified, so we can have an empty loop body. Let me know if something else is confusing :)Haskell,
7471 bytes-3 bytes by actually doing what the specs say it should do.
Try it online!
sumber
IBM/Lotus Notes Formula, 48 bytes
Field formula that takes input from another field
i
.There's no TIO for formula so here's a screenshot of a sample output:
sumber
Powershell,
3632 bytes-4 bytes thanks AdmBorkBork
Testscript:
Output:
sumber
Get-
is implied, so you can remove it for -4 bytes Try it online!PowerShell, 35 bytes
Try it online!
Full program. Takes input
$args
, stores it into$a
, and enters afor
loop. Each iteration we're checking whether$a
is still positive (as0
is falsey in PowerShell). Then we leave$a
on the pipeline and move to the next iteration, where we set$a
to be the result ofGet-Random $a
, which returns an integer in the range0..($a-1)
.(Ab)uses the fact that PowerShell outputs an additional trailing newline in lieu of outputting the final zero (allowed by the rules as currently written).
sumber
"$args"
- nice. I was stuck on$args[0]
in this caseLua, 58 bytes
Try it online!
For some more Lua love here :)
sumber
r
declaration and move it to ther
on the while statement, by doing so you'll use 1 less byte for the space (p,r=print,...p(r)while
).