Tantangan
Tulis sebuah program atau fungsi yang tidak membutuhkan input dan menghasilkan vektor dengan panjang dalam arah acak yang seragam secara teoritis .
Ini sama dengan titik acak pada bola yang dijelaskan oleh
menghasilkan distribusi seperti itu
Keluaran
Tiga mengapung dari distribusi acak yang seragam secara teoritis yang persamaan berlaku untuk batas presisi.
Komentar tantangan
- Distribusi acak harus seragam secara teori . Artinya, jika generator bilangan pseudo-acak harus diganti dengan RNG sejati dari bilangan real , itu akan menghasilkan distribusi acak yang seragam dari titik-titik di bola.
- Menghasilkan tiga angka acak dari distribusi seragam dan menormalkannya tidak valid: akan ada bias terhadap sudut ruang tiga dimensi.
- Demikian pula, menghasilkan dua angka acak dari distribusi seragam dan menggunakannya sebagai koordinat bola tidak valid: akan ada bias terhadap kutub bola.
- Keseragaman yang tepat dapat dicapai oleh algoritma termasuk tetapi tidak terbatas pada:
- Hasilkan tiga angka acak , dan dari distribusi normal (Gaussian) sekitar dan normalkan kembali. 0
- Hasilkan tiga angka acak , dan dari distribusi seragam dalam kisaran . Hitung panjang vektor dengan . Kemudian, jika , tolak vektor dan hasilkan seperangkat angka baru. Lain, jika , normalkan vektor dan kembalikan hasilnya. ( - 1 , 1 ) l = √
- Hasilkan dua angka acak dan dari distribusi seragam dalam kisaran dan konversikan menjadi koordinat bola seperti: sehingga , dan dapat dihitung dengan( 0 , 1 ) θ
- Berikan jawaban singkat tentang algoritma yang Anda gunakan di jawaban Anda.
- Baca lebih lanjut tentang memilih sphere point di MathWorld .
Contoh keluaran
[ 0.72422852 -0.58643067 0.36275628]
[-0.79158628 -0.17595886 0.58517488]
[-0.16428481 -0.90804027 0.38532243]
[ 0.61238768 0.75123833 -0.24621596]
[-0.81111161 -0.46269121 0.35779156]
Komentar umum
- Ini adalah kode-golf , jadi jawabannya menggunakan byte paling sedikit di setiap bahasa yang menang.
- Aturan standar , aturan I / O, dan aturan celah berlaku.
- Harap sertakan tautan Cobalah Online atau yang setara untuk menunjukkan bahwa kode Anda berfungsi.
- Harap motivasikan jawaban Anda dengan penjelasan kode Anda.
pi/6 ≈ 0.5236
menghasilkan output. Itulah area bola yang tertulis dalam kubus unit-areaJawaban:
Bahasa Wolfram (Mathematica) , 20 byte
Cobalah online!
Melakukan persis apa yang tertulis di kaleng.
sumber
R , 23 byte
Cobalah online!
Menghasilkan 3 realisasi dari distribusi dan menormalkan vektor yang dihasilkan.N(0,1)
Plot 1000 realisasi:
sumber
x86-64 Kode Mesin -
63 62 5549 byteMenggunakan algoritma kedua, dimodifikasi. Mengembalikan vektor
[x, y, z, 0]
dalam xmm0.Penjelasan:
Mendorong nilai untuk 1 dan 2 ^ 31 sebagai pelampung ke tumpukan. Data tumpang tindih karena ekstensi tanda, menghemat beberapa byte.
vbroadcastss xmm1,dword ptr [rsp+5]
Memuat nilai untuk 2 ^ 31 ke dalam 4 posisi xmm1.Menghasilkan bilangan bulat 32-bit acak dan memuatnya ke bawah xmm0.
Menghasilkan bilangan bulat 32 bit acak, mengonversinya menjadi float (ditandatangani) dan dibagi 2 ^ 31 untuk mendapatkan angka antara -1 dan 1.
vdpps xmm2,xmm0,xmm0,7Fh
menambahkan kuadrat dari 3 float bawah menggunakan produk titik dengan sendirinya, menutupi float atas. Ini memberi panjangMembandingkan panjang kuadrat dengan 1 dan menolak nilai jika tidak sama dengan 1. Jika panjang kuadrat adalah satu, maka panjangnya juga satu. Itu berarti vektor sudah dinormalisasi dan menyimpan akar kuadrat dan membelah.
Kembalikan tumpukan.
ret
mengembalikan nilai dalam xmm0Cobalah secara Online .
sumber
aesenc
untuk menghasilkan 128 bit "acak" sungguh indah.Python 2 , 86 byte
Cobalah online!
Menghasilkan koordinat z secara seragam dari -1 hingga 1. Kemudian koordinat x dan y disampel secara seragam pada lingkaran jari-jari
(1-z*z)**.5
.Mungkin tidak jelas bahwa distribusi bola berseragam faktor di atas koordinat z (dan juga untuk setiap koordinat). Ini adalah sesuatu yang istimewa untuk dimensi 3. Lihat bukti ini bahwa luas permukaan irisan horizontal bola sebanding dengan tingginya. Meskipun irisan di dekat khatulistiwa memiliki jari-jari lebih besar, irisan di dekat kutub diberi judul lebih ke dalam, dan ternyata kedua efek ini benar-benar membatalkan.
Untuk menghasilkan sudut acak pada lingkaran ini, kami menaikkan unit imajiner
1j
ke kekuatan acak yang seragam antara 0 dan 4, yang menyelamatkan kita dari kebutuhan akan fungsi trigonometri, pi, atau e, yang semuanya membutuhkan impor. Kami kemudian mengekstrak bagian imajiner nyata. Jika kita dapat menampilkan bilangan kompleks untuk dua koordinat, baris terakhir bisa sajaprint a,z
.86 byte
Cobalah online!
Menghasilkan tiga normals dan mengukur hasilnya.
Python 2 dengan numpy, 57 byte
Cobalah online!
sum(a*a)**.5
lebih pendek darilinalg.norm(a)
. Kita juga bisa melakukandot(a,a)
dengan panjang yang samasum(a*a)
. Dalam Python 3, ini dapat disingkata@a
menggunakan operator baru@
.sumber
z
, dari distribusi yang seragam, dibiarkan tidak dimodifikasi.z
, dan memperbaikinya selama beberapa byte.Oktaf ,
40 3322 byteKami sampel membentuk distribusi normal standar 3d dan menormalkan vektor:
Cobalah online!
sumber
disp
:)Unity C # , 34 byte
Unity memiliki builtin untuk nilai acak unit sphere, jadi saya pikir saya akan mempostingnya.
sumber
f=>Random.onUnitSphere
f
Tipe;var
hanya menggunakan karya di dalam metode danSystem.Func<Vector3>
lebih lama.f=>Random.onUnitSphere
ini adalah pengiriman yang benar-benar validf=>UnityEngine.Random.onUnitSphere
menghemat Andausing
MATL , 10 byte
Cobalah online!
Penjelasan
Ini menggunakan pendekatan pertama yang dijelaskan dalam tantangan.
sumber
Ruby ,
34 5049 byteCobalah online!
Mengembalikan array 3 angka
[z,y,x]
.x
dany
dihasilkan dengan menaikkani
(akar kuadrat dari -1) ke kekuatan acak antara 0 dan 4. Angka kompleks ini perlu diskalakan sesuai denganz
nilai yang sesuai dengan teorema Pythagoras:(x**2 + y**2) + z**2 = 1.
The
z
koordinat (yang dihasilkan pertama) hanyalah sebuah nomor terdistribusi secara merata antara -1 dan 1. Meskipun tidak segera jelas, dA / dz untuk sepotong melalui bola adalah konstan (dan sama untuk perimeter lingkaran radius yang sama seperti seluruh bola.).Ini rupanya ditemukan oleh Archimedes yang menggambarkannya dengan cara yang sangat tidak mirip kalkulus, dan dikenal sebagai teorema Archimedes Hat-Box. Lihat https://brilliant.org/wiki/surface-area-sphere/
Referensi lain dari komentar pada jawaban xnor. URL yang sangat pendek, menggambarkan formula sederhana yang mengejutkan: http://mathworld.wolfram.com/Zone.html
sumber
[z, x+yi]
saya akan membiarkannya apa adanya kecuali Anda mengatakan itu OK.z*z
bukanz**2
?z*z
. Saya sudah mengeditnya sekarang. Hal lain yang bisa saya lakukan adalah menggantirand*4
dengan sesuatu sepertiz*99
ataux*9E9
(secara efektif membatasi nilai yang mungkin untuk spiral yang sangat halus pada bola) tetapi saya pikir itu mengurangi kualitas acak.05AB1E ,
2322 byteMenerapkan algoritma ke-2.
Cobalah online atau dapatkan beberapa keluaran acak .
Penjelasan:
CATATAN: 05AB1E tidak memiliki builtin untuk mendapatkan nilai desimal acak dalam kisaran . Sebagai gantinya, saya membuat daftar dengan peningkatan , dan memilih nilai acak dari daftar itu. Peningkatan ini dapat diubah menjadi dengan mengubah ke dalam kode (meskipun itu akan menjadi agak lambat ..).[0,1) 0.00001 0.000000001
5
9
sumber
TI-BASIC, 15 byte *
Menggunakan algoritma "menghasilkan 3 nilai yang didistribusikan secara normal dan menormalkan vektor itu".
Mengakhiri program dengan ekspresi secara otomatis mencetak hasil pada Homescreen setelah program berakhir, sehingga hasilnya benar-benar ditampilkan, bukan hanya dihasilkan dan dihitamkan.
*:
randNorm(
adalah token dua byte , sisanya adalah token satu byte . Saya sudah menghitung awal (tidak dapat dihindari):
, tanpa itu akan menjadi 14 byte. Disimpan sebagai program dengan nama satu huruf, dibutuhkan 24 byte memori, yang mencakup 9 byte overhead sistem file.sumber
JavaScript (ES7),
77 7675 byteMenerapkan algoritma 3 rd , menggunakan .sin(ϕ)=sin(cos−1(z))=1−z2−−−−−√
Cobalah online!
Berkomentar
JavaScript (ES6), 79 byte
Menerapkan algoritma 2 nd .
Cobalah online!
Berkomentar
sumber
Memproses 26 byte
Program lengkap
Ini adalah implementasi https://github.com/processing/processing/blob/master/core/src/processing/core/PVector.java
sumber
Python 2 , 86 byte
Cobalah online!
Menerapkan algoritma pertama.
Python 2 ,
107103 byteCobalah online!
Menerapkan algoritma kedua.
sumber
Haskell ,
125123119118 byteCobalah online!
Apakah tiga seragam seragam dan sampel penolakan.
sumber
JavaScript, 95 byte
Anda
tidakperlu untuk tidak memasukkana
.sumber
Julia 1.0 , 24 byte
Cobalah online!
Menarik vektor dari 3 nilai, yang diambil dari distribusi normal sekitar 0 dengan standar deviasi 1. Kemudian normalkan saja.
sumber
randn()
, dari beberapa tes cepat, tampaknya tidak terikat pada kisaran yang diperlukan. Juga, ini tidak termasuk cek untukhypot()
mengembalikan nilai>1
, yang harus ditolak.randn
mensimulasikan dari distribusi normal standar daripada seragam (0,1), jadi pendekatan ini identik dengan yang R.[-1,1)
kemudian dibagi oleh mereka oleh hypotenuse, yang mana>1
, offset itu? Itu membuat saya bertanya-tanya apakah ternary dalam solusi saya diperlukan ...MathGolf ,
211918 byteImplementasi dari algoritma ke-2.
Cobalah secara online atau lihat beberapa keluaran lainnya secara bersamaan .
Penjelasan:
sumber
Java 8 ( Algoritma ke-3 modifikasi @Arnauld ),
131126119111109 bytePort dari jawaban JavaScript @Arnauld , jadi pastikan untuk menghapusnya!
-2 byte terima kasih kepada @ OlivierGrégoire .
Ini diimplementasikan sebagai:
Cobalah online.
Implementasi algoritma 3 sebelumnya (
131126119 byte):Diimplementasikan sebagai:
Cobalah online.
Penjelasan:
Java 8 (algoritme kedua),
153143 byteCobalah online.
Algoritma 2:
sumber
sqrt(1-k*k)
sebenarnya menghemat lebih banyak byte di Jawa daripada di JS. :)M.sin
, 1xM.cos
dan 1xM.acos
, pendekatan Anda menggunakan 2xM.sin
dan 1xM.sqrt
, yang merupakan asal tambahan byte yang disimpan. :)double[]
karena itu tidak mengubah byte-count.)Japt , 20 byte
Implementasi Port of Arnauld untuk algoritma ke-2.
Menguji
sumber
Pyth , 24 byte
Cobalah online!
Menggunakan algoritma # 2
sumber
OCaml ,
1109995 byteEDIT: Memotong beberapa byte dengan inlining dan , mengganti yang pertama dengan a , dan mengambil keuntungan dari asosiatif operator untuk menghindari beberapa paren .i j
let ... in
fun
()
Cobalah online
Solusi asli:
Pertama saya mendefinisikan:
Random.float
Fungsi OCaml termasuk batas. Kemudian,Ini sangat mirip dengan implementasi contoh ke-3 (dengan dan ) kecuali bahwa saya memilih dan dalam interval yang lebih besar untuk menghindari perkalian (dengan 2) nanti.ϕ=p θ=t − i j
sumber
0
dan1
langsung sebagai koordinat bola. Ini tidak benar, seperti yang diperlihatkan dalam tantangan 3 dan 4, karena Anda berakhir dengan bias terhadap kutub bola. Anda dapat memperbaikinya dengan menerapkan metode yang ditunjukkan pada komentar 4.