Chọn ngẫu nhiên các vô hướng của một mảng


14

Bạn phải điền một mảng với mỗi số từ 0-nbao gồm. Không có số nên lặp lại. Tuy nhiên, chúng phải theo thứ tự ngẫu nhiên.

Quy tắc

Tất cả các quy tắc tiêu chuẩn và sơ hở tiêu chuẩn đều bị cấm

Các mảng phải được tạo giả ngẫu nhiên. Mỗi hoán vị có thể nên có một xác suất bằng nhau.

Đầu vào

n theo bất kỳ cách nào được cho phép trong bài đăng I / O trên meta.

Đầu ra

Các dãy số được xáo trộn từ 0-nbao gồm.


đầu ra có thể được phân tách bằng dòng mới?
DrnglVrss

@Riley opps có nghĩa là đã đi xin lỗi.
Christopher

@DrnglVrss có thể
Christopher

Theo "số" Tôi giả sử bạn có nghĩa là "số nguyên"?
Zacharý

1
@KevinCruijssen Danh sách IMO = mảng nhưng có hỗ trợ tìm kiếm. Vì vậy, chắc chắn sử dụng một danh sách
Christopher

Câu trả lời:


9

Perl 6 , 14 byte

{pick *,0..$_}

Thử nó

Mở rộng:

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

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


8

Bình thường, 3 byte

.Sh

Trình diễn

.Slà xáo trộn. Nó ngầm định đưa một số nguyên đầu vào vào nphạm vi [0, 1, ..., n-1]. h+1, và đầu vào được thực hiện ngầm.










3

Japt , 4 byte

ò öx

Dùng thử trực tuyến


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

Trời ạ, tôi nghĩ öxsẽ đủ cho đến khi tôi nhận thấy phần "bao gồm". (Bạn có thể thay thế xbằng hầu hết mọi thứ khác, btw)
Sản phẩm ETH

@ETHproductions, đó cũng là suy nghĩ đầu tiên của tôi.
Xù xì

3

C #, 76 byte

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

Điều này trả về một IOrderedEnumerable, tôi hy vọng điều đó ổn, nếu không tôi cần thêm một vài byte cho một .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 và được sửa lỗi nhờ @ OlivierGrégoire .
-4 byte nhờ @Jakob .
-10 byte bằng cách loại bỏ .toArray().

Giải trình:

Hãy thử nó ở đây.

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
Lỗi: không bao gồm n. Sửa chữa và chơi gôn : for(n++;--n>=0;l.add(n));. Ngoài ra, tôi nói rằng bạn không cần phải trả về một mảng. Mảng và danh sách giống nhau trong hầu hết các ngôn ngữ, vì vậy chỉ cần trả về danh sách.
Olivier Grégoire

@ OlivierGrégoire Woops .. Đó là những gì bạn nhận được vì không kiểm tra đúng cách và chỉ đăng .. Cảm ơn vì đã sửa lỗi (và 4 byte được lưu trong quy trình).
Kevin Cruijssen

1
Vâng, ba thực sự, bởi vì tôi đã chỉnh sửa một lần nữa, bản thân tôi đã giới thiệu một lỗi khác: >nên có >=.
Olivier Grégoire

1
-4 byte: sử dụng Stackthay vì a Vectorvà thay đổi vòng lặp của bạn thành for(;n>=0;l.add(n--));. Và trả lại một java.util.Listlà chắc chắn tốt.
Jakob


2

Bình, 4 byte

.S}0

Hãy thử nó ở đây!


Bạn có thể chơi gôn tới 3 byte. .Svới một đối số nguyên giống như .SU[0..n]có thể được mã hóa thành Uh, do đó bạn có thể sử dụng .SUh, sau đó trở thành .Sh.
Erik the Outgolfer

@EriktheOutgolfer cảm ơn vì gợi ý, nhưng vì ai đó đã đọc bài đăng mà bạn đề xuất, tôi sẽ để nó như thế này.
KarlKastor

Chà, đó là ranh giới cho dù đó có phải là một câu trả lời riêng biệt hay không, nhưng tôi tin rằng nó được tính là một bản sao, vì vậy ngay cả khi nó được cho phép, tôi coi đó chỉ là sự thay thế được xây dựng, vì vậy, tôi không muốn đăng riêng biệt, nhưng isaacg đã làm.
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;}}

Hàm đệ quy khởi tạo từ đầu của mảng trên đường vào và hoán đổi với một phần tử ngẫu nhiên trước khi nó xuất hiện.


Nếu như n > 98?
LegionMammal978

Tất nhiên, nó sẽ thất bại, nhưng phạm vi đầu vào không được chỉ định trong vấn đề. Xin đừng biến tôi thành malloc :)
Computronium

thay đổi athành một para để phù hợp với quy tắc hơn?
l4m2


2

Than , 33 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã.

Rõ ràng phải mất 17 byte để loại bỏ một phần tử khỏi danh sách trong Char than.

Chỉnh sửa: Ngày nay, nó chỉ mất ba byte, giả sử bạn muốn xóa tất cả các lần xuất hiện của mục khỏi danh sách. Điều này cộng với các thay đổi Char than khác đã cắt câu trả lời xuống còn 21 byte: Hãy thử trực tuyến!


Rất nhiều
Christopher

2

APL (Dyalog) , 5 byte

?⍨1+⊢

Hãy thử trực tuyến!

Giả định ⎕IO←0 , được mặc định trên nhiều máy.

Giải trình

lập luận đúng

1+ thêm 1 vào nó

?⍨tạo các số 0 .. 1+⊢-1 và giải quyết ngẫu nhiên chúng trong một mảng để không có hai số lặp lại


2

q / kdb +, 11 byte

Giải pháp:

{(0-x)?1+x}

Thí dụ:

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

Giải trình:

Sử dụng ? toán tử với đầu vào phủ định để đưa ra danh sách đầy đủ 0->nmà không trùng lặp:

{(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 (nhàm chán)

randIntNoRep(0,Ans

Đúng, một nội dung. randIntNoRep(là mã thông báo hai byte và Anslà một byte.

Vui hơn, 34 byte:

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

Trực tiếp từ tibasicdev . Có thể chơi gôn, nhưng tôi chưa tìm thấy gì.

Điều này làm gì: Sắp xếp một mảng ngẫu nhiên, di chuyển các phần tử của đối số thứ hai ( L₁ở đây) theo cùng cách với các phần tử tương ứng của chúng.


1

JavaScript (ES6), 51 byte

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

2
Tôi không nghĩ đây là đồng phục; Tôi đã thử f(5)10 lần và 5luôn là một trong hai mục cuối.
Sản phẩm ETH

Chỉ cần chạy lại một vài lần bản thân mình và có 1,5,4,0,2,3& 1,0,2,5,3,4. EDIT: Và một vài prnt.sc/fe0goe
Shaggy

3
Chỉ cần chạy thử nghiệm nhanh, chạy f(5)1e5 lần và tìm vị trí trung bình của mỗi số trong kết quả. Mảng kết quả là [ 1.42791, 1.43701, 2.00557, 2.6979, 3.3993, 4.03231 ], vì vậy tôi không nghĩ nó đồng nhất. ( )
Sản phẩm ETH

Tôi nghĩ rằng tôi có một giải pháp 93 byte có thể làm việc. n=>(a=[...Array(n).keys(),n++]).reduce((a,v,i)=>([a[i],a[j]]=[a[j=n*Math.random()|0],v],a),a)?
kamoroso94

Sắp xếp theo kết quả random()không thống nhất. Xem (ví dụ) vi.wikipedia.org/wiki/BrowserChoice.eu#Criticism
Neil

1

Aceto , 15 14 16 byte

@lXp
Y!`n
zi&
0r

Nhấn số 0 trên ngăn xếp, đọc một số nguyên, xây dựng một phạm vi và xáo trộn nó:

Y
zi
0r

Đặt dấu bắt, độ dài kiểm tra cho 0 và thoát (trong trường hợp đó):

@lX
 !`

Khác in giá trị, một dòng mới và quay lại kiểm tra độ dài:

   p
   n
  &

(Tôi đã phải thay đổi mã vì tôi nhận ra mình đã đọc sai câu hỏi và đã xây dựng một phạm vi từ 1-n, không phải 0-n.)




1

8 , 42 36 34 byte

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

SED (Sơ đồ hiệu ứng ngăn xếp) là n -- a

Cách sử dụng và ví dụ

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

Tạo một mảng của hình thức

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

Sau đó sắp xếp nó và trả về các phần tử cuối cùng theo thứ tự mới


1

J, 11 byte

(?@!A.i.)>:

Giải trình:

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

Ví dụ:

    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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.