Randomizza gli scalari di un array


14

È necessario riempire un array con ogni numero 0-ncompreso. Nessun numero dovrebbe ripetere. Tuttavia, devono essere in ordine casuale.

Regole

Sono vietate tutte le regole standard di e scappatoie standard

L'array deve essere generato in modo pseudo casuale. Ogni possibile permutazione dovrebbe avere la stessa probabilità.

Ingresso

n in alcun modo consentito nel post I / O su meta.

Produzione

L'array di numeri è composto da 0-ninclusivo.


l'output può essere separato da newline?
DrnglVrgs,

@Riley opp che doveva essere dispiaciuto.
Christopher,

@DrnglVrgs sì, può
Christopher

Per "numeri" suppongo che intendi "numeri interi"?
Zacharý

1
@KevinCruijssen Elenchi IMO = array ma con supporto per la ricerca. Quindi sicuramente usa un elenco
Christopher

Risposte:


9

Perl 6 , 14 byte

{pick *,0..$_}

Provalo

Allargato:

{           # 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

Dimostrazione

.Sè shuffle. Si getta implicitamente un numero intero di ingresso nalla gamma [0, 1, ..., n-1]. hè +1, e l'input è preso implicitamente.


7

R , 16 byte

sample(0:scan())

legge da stdin. samplecampiona casualmente dal vettore di input, restituendo una sequenza (pseudo) casuale.

Provalo online!







3

MATL , 4 byte

QZ@q

Provalo online!

Spiegazione

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

Provalo online


    :Implicit input of integer U
ò   :Generate array of 0 to U.
öx  :Generate random permutation of array.
    :Implicit output of result.

Accidenti, ho pensato che öxsarebbe bastato fino a quando non ho notato la parte "inclusiva". (Potresti sostituirlo xcon quasi qualsiasi altra cosa, a proposito)
ETHproductions

@ETHproductions, anche questo è stato il mio primo pensiero.
Shaggy,

3

C #, 76 byte

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

Questo restituisce un IOrderedEnumerable, spero che vada bene, altrimenti ho bisogno di qualche byte in più per un .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 e correzione di errori grazie a @ OlivierGrégoire .
-4 byte grazie a @Jakob .
-10 byte rimuovendo .toArray().

Spiegazione:

Provalo qui.

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: non include n. Fissare e golf: for(n++;--n>=0;l.add(n));. Inoltre, dico che non è necessario restituire un array. L'array e l'elenco sono gli stessi nella maggior parte delle lingue, quindi è sufficiente restituire l'elenco.
Olivier Grégoire,

@ OlivierGrégoire Woops .. Questo è quello che ottieni non controllando correttamente e solo postando .. Grazie per la correzione di bug (e 4 byte salvati nel processo).
Kevin Cruijssen,

1
Bene, tre in realtà, perché ho modificato di nuovo, avendo me stesso introdotto un altro bug: >dovrebbe essere >=.
Olivier Grégoire il

1
-4 byte: usa a Stackinvece di a Vectore cambia il tuo ciclo in for(;n>=0;l.add(n--));. E tornare a java.util.Listva decisamente bene.
Jakob,


2

Pyth, 4 byte

.S}0

Provalo qui!


Puoi giocare a golf a 3 byte. .Scon un argomento intero è uguale a .SU, e [0..n]può essere codificato come Uh, quindi è possibile utilizzare .SUh, che diventa .Sh.
Erik the Outgolfer

@EriktheOutgolfer grazie per il suggerimento, ma come qualcuno ha già pubblicato la soluzione che proponi lascerò questo come questo.
KarlKastor,

Beh, è ​​al limite se quella avrebbe dovuto essere una risposta separata o no, ma credo che contenga come un dupe, quindi anche se fosse permesso, lo considererei solo una sostituzione integrata, quindi nah, non volevo pubblicare separato, ma isaacg l'ha fatto.
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;}}

Funzione ricorsiva che si inizializza dall'estremità dell'array al momento dell'ingresso e si scambia con un elemento casuale prima che esso venga espulso.


E se n > 98?
LegionMammal978,

Naturalmente fallirebbe, ma l'intervallo di input non è stato specificato nel problema. Per favore, non farmi malloc :)
Computronio

cambiare ain un para per adattarsi maggiormente alla regola?
l4m2


2

Carbone , 33 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice.

Apparentemente sono necessari 17 byte per rimuovere un elemento da un elenco in Carbone.

Modifica: in questi giorni ci vogliono solo tre byte, supponendo che si desideri rimuovere tutte le occorrenze dell'elemento dall'elenco. Questo più altre modifiche al carbone riducono la risposta a 21 byte: provala online!


Yikes che è molto
Christopher

2

APL (Dyalog) , 5 byte

?⍨1+⊢

Provalo online!

Presuppone ⎕IO←0, che è predefinito su molte macchine.

Spiegazione

l'argomento giusto

1+ aggiungere 1 ad esso

?⍨generare numeri 0 .. 1+⊢-1 e distribuirli casualmente in un array in modo che non si ripetano due numeri


2

q / kdb +, 11 byte

Soluzione:

{(0-x)?1+x}

Esempio:

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

Spiegazione:

Utilizzare l' ? operatore con un input negativo per fornire l'elenco completo di 0->nsenza duplicati:

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

randIntNoRep(0,Ans

Sì, incorporato. randIntNoRep(è un token a due byte ed Ansè un byte.

Più divertente, 34 byte:

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

Direttamente da tibasicdev . Probabilmente giocabile a golf, ma non ho ancora trovato nulla.

Cosa fa: ordina un array casuale, spostando gli elementi del secondo arg ( L₁qui) allo stesso modo dei loro elementi corrispondenti.


1

JavaScript (ES6), 51 byte

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

2
Non penso che questo sia uniforme; Ho provato f(5)10 volte ed 5è stato uno degli ultimi due articoli ogni volta.
Produzioni ETH

L'ho eseguito di nuovo un paio di volte da solo e ho ricevuto 1,5,4,0,2,3& 1,0,2,5,3,4. EDIT: E qualche altro prnt.sc/fe0goe
Shaggy,

3
Ho appena eseguito un test rapido che viene eseguito f(5)1e5 volte e trova la posizione media di ciascun numero nei risultati. L'array risultante era [ 1.42791, 1.43701, 2.00557, 2.6979, 3.3993, 4.03231 ], quindi non penso che sia uniforme. ( codice )
ETHproductions

Penso di avere una soluzione a 93 byte che potrebbe funzionare. n=>(a=[...Array(n).keys(),n++]).reduce((a,v,i)=>([a[i],a[j]]=[a[j=n*Math.random()|0],v],a),a)?
kamoroso94

L'ordinamento sul risultato di random()non è uniforme. Vedi (ad esempio) en.wikipedia.org/wiki/BrowserChoice.eu#Criticism
Neil

1

Aceto , 15 14 16 byte

@lXp
Y!`n
zi&
0r

Premi zero sullo stack, leggi un numero intero, costruisci un intervallo e mescolalo:

Y
zi
0r

Impostare un segno di cattura, la lunghezza del test per 0 e (in tal caso) uscire:

@lX
 !`

Altrimenti stampa il valore, una nuova riga e torna al test di lunghezza:

   p
   n
  &

(Ho dovuto cambiare il codice perché mi sono reso conto di aver letto male la domanda e avevo costruito un intervallo da 1-n, non 0-n.)


1

Vai , 92 byte

Per lo più perdere la necessità di seminare il PRNG.

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

Provalo online!



1

8 , 42 36 34 byte

Codice

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

SED (Stack Effect Diagram) è n -- a

Uso ed esempio

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

Crea una matrice di moduli

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

Quindi lo ordina e restituisce gli ultimi elementi nel nuovo ordine


1

J, 11 byte

(?@!A.i.)>:

Spiegazione:

         >:   | 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

Esempi:

    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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.