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.


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)
}


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.


7

R , 16 byte

sample(0:scan())

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

Cobalah online!







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


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.

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 ()



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

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

Pyth, 4 Bytes

.S}0

Coba di sini!


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.


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


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!


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


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'

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.


1

JavaScript (ES6), 51 byte

n=>[...Array(n+1).keys()].sort(_=>.5-Math.random())

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.)




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]

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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.