Acak skalar dari array

14

Anda harus mengisi array dengan setiap angka dari 0-ninklusif. Tidak ada angka yang harus diulang. Namun mereka harus dalam urutan acak.

Aturan

Semua aturan standar dan celah standar dilarang

Array harus dibuat pseudo-acak. Setiap permutasi yang mungkin harus memiliki probabilitas yang sama.

Memasukkan

n dengan cara apa pun diizinkan di pos I / O pada meta.

Keluaran

Array angka diacak dari 0-ninklusif.

Christopher
sumber
output dapat dipisahkan oleh baris baru?
DrnglVrgs
@Riley opps yang seharusnya hilang maaf.
Christopher
@DrnglVrgs ya itu bisa
Christopher
Dengan "angka" Saya menganggap Anda maksud "bilangan bulat"?
Zacharý
1
@KevinCruijssen daftar IMO = array tetapi dengan dukungan pencarian. Jadi, pastikan Anda menggunakan daftar
Christopher

Jawaban:

9

Perl 6 , 14 byte

{pick *,0..$_}

Cobalah

Diperluas:

{           # bare block lambda with implicit parameter 「$_」

  pick      # choose randomly without repeats
    *,      # Whatever (all)
    0 .. $_ # Range from 0, to the input (inclusive)
}
Brad Gilbert b2gills
sumber
8

05AB1E , 3 byte

Ý.r

Cobalah online!

Ý   # Make a list from 0 to input
 .r # Shuffle it randomly
Riley
sumber
8

Pyth, 3 byte

.Sh

Demonstrasi

.Smengocok. Secara implisit melemparkan integer input nke kisaran [0, 1, ..., n-1]. hadalah +1, dan input diambil secara implisit.

isaacg
sumber
7

R , 16 byte

sample(0:scan())

dibaca dari stdin.samplesampel secara acak dari vektor input, mengembalikan urutan acak (semu).

Cobalah online!

Giuseppe
sumber
6

Jelly , 3 byte

0rẊ

Cobalah online!

Penjelasan:

0rẊ 
0r  Inclusive range 0 to input.
  Ẋ Shuffle.
    Implicit print.

Solusi alternatif, 3 byte

‘ḶẊ

Penjelasan:

‘ḶẊ
‘   Input +1
 Ḷ  Range 0 to argument.
  Ẋ Shuffle.

Cobalah online!

Kamerad SparklePony
sumber
5

Python 2 , 51 byte

lambda n:sample(range(n+1),n+1)
from random import*

Cobalah online!

Ada random.shuffle()tetapi memodifikasi argumen di tempat bukannya mengembalikannya ...

benar-benar manusiawi
sumber
Anda dapat menggunakanrandom.shuffle
caird coinheringaahing
@cairdcoinheringaahing Ya, tapi itu tidak berhasil. Misalnya, lambda n:shuffle(range(n+1))tidak akan menulis output di mana pun.
totallyhuman
4

Bash, 18 11 byte

shuf -i0-$1

Cobalah online!

DrnglVrgs
sumber
Jika baris baru diizinkan, kami dapat melupakan bagian gema
DrnglVrgs
3

Mathematica, 24 byte

RandomSample@Range[0,#]&
J42161217
sumber
3

MATL , 4 byte

QZ@q

Cobalah online!

Penjelasan

Q     % Implicitly input n. Add 1
Z@    % Random permutation of [1 2 ... n+1]
q     % Subtract 1, element-wise. Implicitly display
Luis Mendo
sumber
3

Japt , 4 byte

ò öx

Cobalah online


    :Implicit input of integer U
ò   :Generate array of 0 to U.
öx  :Generate random permutation of array.
    :Implicit output of result.
Shaggy
sumber
Astaga, saya pikir öxsudah cukup sampai saya perhatikan bagian "inklusif". (Anda dapat mengganti xdengan hampir semua hal lain, btw)
ETHproduksi
@ ETHproductions, itu juga yang pertama kali saya pikirkan.
Shaggy
3

C #, 76 byte

using System.Linq;i=>new int[i+1].Select(x=>i--).OrderBy(x=>Guid.NewGuid());

Ini mengembalikan IOrderedEnumerable, saya harap tidak apa-apa, atau saya butuh beberapa byte lagi untuk .ToArray ()

LiefdeWen
sumber
3

CJam , 7 6 byte

1 byte dihapus berkat Erik the Outgolfer .

{),mr}

Ini adalah blok anonim (fungsi) yang mengambil bilangan bulat dari tumpukan dan menggantinya dengan hasilnya. Cobalah online!

Penjelasan

{     e# Begin block
)     e# Increment: n+1
,     e# Range: [0 1 ... n]
mr    e# Shuffle
}     e# End block
Luis Mendo
sumber
Bukankah {),mr}1 byte lebih pendek?
Erik the Outgolfer
@EriktheOutgolfer Memang! Terima kasih
Luis Mendo
3

Java 8, 114 111 97 byte

import java.util.*;n->{List l=new Stack();for(;n>=0;l.add(n--));Collections.shuffle(l);return l;}

-3 byte dan bug-fix berkat @ OlivierGrégoire .
-4 byte terima kasih kepada @Jakob .
-10 byte dengan menghapus.toArray() .

Penjelasan:

Coba di sini.

import java.util.*;        // Required import for List, Stack and Collections
n->{                       // Method with integer parameter and Object-array return-type
  List l=new Stack();      //  Initialize a List
  for(;n>=0;l.add(n--));   //  Loop to fill the list with 0 through `n`
  Collections.shuffle(l);  //  Randomly shuffle the List
  return l;                //  Convert the List to an Object-array and return it
}                          // End of method
Kevin Cruijssen
sumber
1
Bug: tidak termasuk n. Memperbaiki dan golf: for(n++;--n>=0;l.add(n));. Juga, saya katakan Anda tidak perlu mengembalikan array. Array dan daftar adalah sama di sebagian besar bahasa, jadi kembalikan daftarnya.
Olivier Grégoire
@ OlivierGrégoire Woops .. Itulah yang Anda dapatkan karena tidak memeriksa dengan benar dan hanya memposting .. Terima kasih untuk perbaikan bug (dan 4 byte disimpan dalam proses).
Kevin Cruijssen
1
Ya, tiga sebenarnya, karena saya mengedit lagi, setelah saya memperkenalkan bug lain: >seharusnya >=.
Olivier Grégoire
1
-4 byte: gunakan a Stackbukan a Vectordan ubah loop Anda menjadi for(;n>=0;l.add(n--));. Dan mengembalikan a java.util.Listpasti baik-baik saja.
Jakob
2

Ohm , 2 byte

#╟

Cobalah online!

Nick Clifford
sumber
Ini tautan yang lebih baik.
Erik the Outgolfer
2

Pyth, 4 Bytes

.S}0

Coba di sini!

KarlKastor
sumber
Anda dapat bermain golf hingga 3 byte. .Sdengan argumen integer sama dengan .SU, dan [0..n]dapat dikodekan sebagai Uh, jadi Anda dapat menggunakan .SUh, yang kemudian menjadi .Sh.
Erik the Outgolfer
@EriktheOutgolfer terima kasih atas petunjuknya, tetapi karena seseorang telah memposting solusi yang Anda usulkan, saya akan meninggalkan ini karena ini.
KarlKastor
Yah, itu batas apakah itu seharusnya menjadi jawaban yang terpisah atau tidak, tapi saya percaya itu dianggap sebagai penipuan, jadi meskipun diizinkan, saya akan menganggapnya hanya dibangun sebagai pengganti, jadi nah, saya tidak ingin memposting terpisah, tetapi isaacg melakukannya.
Erik the Outgolfer
2

C, 75 byte

a[99],z,y;f(n){if(n){a[n]=--n;f(n);z=a[n];a[n]=a[y=rand()%(n+1)];a[y]=z;}}

Fungsi rekursif yang diinisialisasi dari ujung array di jalan masuk, dan bertukar dengan elemen acak sebelum keluar.

Computronium
sumber
Bagaimana jika n > 98?
LegionMammal978
Itu akan gagal, tentu saja, tetapi jangkauan input tidak ditentukan dalam masalah. Tolong jangan buat saya malloc :)
Computronium
berubah amenjadi para agar lebih cocok dengan aturan?
14m2
67 byte
ceilingcat
2

Arang , 33 byte

A…·⁰NβFβ«AβδA‽δθPIθ↓A⟦⟧βFδ¿⁻θκ⊞βκ

Cobalah online! Tautan adalah untuk mengucapkan versi kode.

Tampaknya dibutuhkan 17 byte untuk menghapus elemen dari daftar di Charcoal.

Sunting: Hari ini hanya membutuhkan tiga byte, dengan asumsi Anda ingin menghapus semua kemunculan item dari daftar. Ini ditambah perubahan Arang lainnya memotong jawabannya menjadi 21 byte: Cobalah online!

Neil
sumber
Astaga, banyak
Christopher
2

APL (Dyalog) , 5 byte

?⍨1+⊢

Cobalah online!

Diasumsikan ⎕IO←0 , yang merupakan default pada banyak mesin.

Penjelasan

argumen yang benar

1+ tambahkan 1 ke dalamnya

?⍨menghasilkan angka 0 .. 1+⊢-1 dan secara acak menanganinya dalam array sehingga tidak ada dua angka yang berulang

Kritixi Lithos
sumber
2

q / kdb +, 11 byte

Larutan:

{(0-x)?1+x}

Contoh:

q){(0-x)?1+x}10
5 9 7 1 2 4 8 0 3 10
q){(0-x)?1+x}10
6 10 2 8 4 5 9 0 7 3
q){(0-x)?1+x}10
9 6 4 1 10 8 2 7 0 5

Penjelasan:

Gunakan ? operator dengan input negatif untuk memberikan daftar lengkap 0->ntanpa duplikat:

{(0-x)?1+x} / solution
{         } / lambda expression
         x  / implicit input
       1+   / add one
      ?     / rand
 (0-x)      / negate x, 'dont put item back in the bag'
streetster
sumber
2

TI-83 BASIC, 5 byte (membosankan)

randIntNoRep(0,Ans

Yap, seorang builtin. randIntNoRep(adalah token dua byte, dan Anssatu byte.

Lebih menyenangkan, 34 byte:

Ans→N
seq(X,X,0,N→L₁
rand(N+1→L₂
SortA(L₂,L₁
L₁

Langsung dari tibasicdev . Mungkin golf, tapi saya belum menemukan apa pun.

Kegunaannya: Mengurutkan array acak, menggerakkan elemen dari arg kedua (di L₁sini) dengan cara yang sama dengan elemen yang sesuai.

Khuldraeseth na'Barya
sumber
1

JavaScript (ES6), 51 byte

n=>[...Array(n+1).keys()].sort(_=>.5-Math.random())
Shaggy
sumber
2
Saya tidak berpikir ini seragam; Saya sudah mencoba f(5)10 kali dan 5telah menjadi salah satu dari dua item terakhir setiap kali.
ETHproduksi
Cukup jalankan lagi beberapa kali dan dapatkan 1,5,4,0,2,3& 1,0,2,5,3,4. EDIT: Dan beberapa prnt.sc/fe0goe
Shaggy
3
Cukup jalankan tes cepat yang berjalan f(5)1e5 kali dan temukan posisi rata-rata setiap angka dalam hasil. Array yang dihasilkan adalah [ 1.42791, 1.43701, 2.00557, 2.6979, 3.3993, 4.03231 ], jadi saya tidak berpikir itu seragam. ( kode )
ETHproduksi
Saya pikir saya punya solusi 93 byte yang bisa bekerja. n=>(a=[...Array(n).keys(),n++]).reduce((a,v,i)=>([a[i],a[j]]=[a[j=n*Math.random()|0],v],a),a)?
kamoroso94
Mengurutkan pada hasil random()tidak seragam. Lihat (misalnya) en.wikipedia.org/wiki/BrowserChoice.eu#Criticism
Neil
1

Aceto , 15 14 16 byte

@lXp
Y!`n
zi&
0r

Tekan nol pada tumpukan, baca bilangan bulat, buat rentang, dan kocok:

Y
zi
0r

Tetapkan tanda tangkap, panjang uji untuk 0, dan (dalam kasus itu) keluar:

@lX
 !`

Lain cetak nilai, baris baru, dan lompat kembali ke tes panjang:

   p
   n
  &

(Saya harus mengubah kode karena saya menyadari saya salah membaca pertanyaan dan telah membangun rentang dari 1-n, bukan 0-n.)

L3viathan
sumber
1

Pergi , 92 byte

Sebagian besar kalah dari kebutuhan untuk menyemai PRNG.

import(."fmt";."math/rand";."time")
func f(n int){Seed(Now().UnixNano());Println(Perm(n+1))}

Cobalah online!

benar-benar manusiawi
sumber
1

Ruby, 20 byte

->n{[*0..n].shuffle}

canhascodez
sumber
1

8 , 42 36 34 byte

Kode

>r [] ' a:push 0 r> loop a:shuffle

SED (Stack Effect Diagram) adalah n -- a

Penggunaan dan contoh

ok> 5 >r [] ' a:push 0 r> loop a:shuffle .
[2,5,0,3,1,4]
Kekacauan Manor
sumber
1

Javascript (ES6), 68 byte

n=>[...Array(n+1)].map((n,i)=>[Math.random(),i]).sort().map(n=>n[1])

Membuat array formulir

[[Math.random(), 0],
 [Math.random(), 1],
 [Math.random(), 2],...]

Kemudian sortir dan kembalikan elemen terakhir dalam orde baru

Oki
sumber
1

J, 11 Bytes

(?@!A.i.)>:

Penjelasan:

         >:   | Increment
(?@!A.i.)     | Fork, (f g h) n is evaluated as (f n) g (h n)
      i.      | Integers in range [0,n) inclusive
 ?@!          | Random integer in the range [0, n!)
    A.        | Permute right argument according to left

Contoh:

    0 A. i.>:5
0 1 2 3 4 5
    1 A. i.>:5
0 1 2 3 5 4
    (?@!A.i.)>: 5
2 3 5 1 0 4
    (?@!A.i.)>: 5
0 3 5 1 2 4
Bolce Bussiere
sumber
1

Tcl , 90 byte

proc R n {lsort -c {try expr\ rand()>.5 on 9} [if [incr n -1]+2 {concat [R $n] [incr n]}]}

Cobalah online!

Tcl , 96 byte

proc R n {proc f a\ b {expr rand()>.5}
set i -1
while \$i<$n {lappend L [incr i]}
lsort -c f $L}

Cobalah online!

sergiol
sumber
Cobalah untuk outgolf mendapat jumlah byte yang sama: tio.run/…
sergiol