Рандомизировать скаляры массива


14

Вы должны заполнить массив каждым числом от 0-nвключительно. Числа не должны повторяться. Однако они должны быть в случайном порядке.

правила

Все стандартные правила и стандартные лазейки запрещены

Массив должен быть сгенерирован псевдослучайно. Каждая возможная перестановка должна иметь равную вероятность.

вход

n любым способом, разрешенным в посте ввода / вывода по мета.

Выход

Массив чисел скремблирован от 0-nвключительно.


вывод можно разделить переводом строки?
DrnglVrgs

@Riley Opps, который должен был уйти извините.
Кристофер

@DrnglVrgs да, может
Кристофер

Под "числами" я предполагаю, что вы имеете в виду "целые числа"?
Захари

1
@KevinCruijssen IMO lists = array, но с поддержкой поиска. Поэтому обязательно используйте список
Кристофер

Ответы:




8

Pyth, 3 байта

.Sh

демонстрация

.Sв случайном порядке Он неявно преобразует входное целое число nв диапазон [0, 1, ..., n-1]. hесть +1, и ввод принимается неявно.




5

Python 2 , 51 байт

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

Попробуйте онлайн!

Есть, random.shuffle()но он изменяет аргумент вместо того, чтобы возвращать его ...


Вы можете использоватьrandom.shuffle
caird coinheringaahing

@cairdcoinheringaahing Да, но это не сработает. Например, lambda n:shuffle(range(n+1))никуда не напишу вывод.
полностью человек






3

Japt , 4 байта

ò öx

Попробуйте онлайн


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

Черт возьми, я думал, öxчто будет достаточно, пока я не заметил "инклюзивную" часть. ( xКстати, вы можете заменить почти что-нибудь еще)
ETHproductions

@ETHproductions, это была моя первая мысль.
Лохматый

3

C #, 76 байт

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

Это возвращает IOrderedEnumerable, я надеюсь, что все в порядке, иначе мне нужно еще несколько байтов для .ToArray ()


3

CJam , 7 6 байтов

1 байт удален благодаря Эрику-аутголферу .

{),mr}

Это анонимный блок (функция), который берет целое число из стека и заменяет его результатом. Попробуйте онлайн!

объяснение

{     e# Begin block
)     e# Increment: n+1
,     e# Range: [0 1 ... n]
mr    e# Shuffle
}     e# End block

Разве {),mr}1 байт не короче?
Эрик Outgolfer

@EriktheOutgolfer Действительно! Спасибо
Луис Мендо

3

Java 8, 114 111 97 байт

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

-3 байта и исправлена ​​ошибка благодаря @ OlivierGrégoire .
-4 байта благодаря @Jakob .
-10 байт путем удаления .toArray().

Объяснение:

Попробуй это здесь.

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
Ошибка: не включает n. Закрепить и гольф: for(n++;--n>=0;l.add(n));. Также я говорю, что вам не нужно возвращать массив. Массив и список одинаковы в большинстве языков, поэтому просто верните список.
Оливье Грегуар

@ OlivierGrégoire Woops .. Это то, что вы получаете за то, что не проверяете должным образом и просто публикуете .. Спасибо за исправление ошибки (и 4 байта, сохраненные в процессе).
Кевин Круйссен

1
Ну, на самом деле три, потому что я снова отредактировал, введя еще одну ошибку: >должно быть >=.
Оливье Грегуар

1
-4 байта: используйте Stackвместо a Vectorи измените ваш цикл на for(;n>=0;l.add(n--));. И возвращение java.util.Listопределенно хорошо.
Якоб


2

Pyth, 4 байта

.S}0

Попробуй это здесь!


Вы можете играть в гольф до 3 байтов. .Sс целочисленным аргументом такой же, как .SUи [0..n]может быть закодирован Uh, так что вы можете использовать .SUh, который затем становится .Sh.
Эрик Outgolfer

@EriktheOutgolfer спасибо за подсказку, но, поскольку кто-то уже опубликовал решение, которое вы предлагаете, я оставлю это как это.
КарлКастор

Ну, это границы, должен ли это быть отдельный ответ или нет, но я считаю, что это считается обманом, поэтому даже если это разрешено, я бы посчитал это просто встроенной заменой, так что нет, я не хотел публиковать отдельно, но Исаак сделал.
Эрик Outgolfer

2

C 75 байтов

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

Рекурсивная функция, которая инициализируется с конца массива при входе и заменяет случайный элемент перед выходом.


Что если n > 98?
LegionMammal978

Конечно, он потерпит неудачу, но в задаче не указан диапазон ввода. Пожалуйста, не делай меня маллок :)
Computronium

изменить aв пункт, чтобы соответствовать правилу больше?
м2


2

Древесный уголь , 33 байта

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

Попробуйте онлайн! Ссылка на подробную версию кода.

По-видимому, для удаления элемента из списка в Charcoal требуется 17 байт.

Изменить: В настоящее время это занимает всего три байта, при условии, что вы хотите удалить все вхождения элемента из списка. Это плюс другие изменения в Charcoal сокращают ответ до 21 байта: попробуйте онлайн!


Это очень много
Кристофер

2

APL (Dyalog) , 5 байтов

?⍨1+⊢

Попробуйте онлайн!

Предполагается ⎕IO←0, что по умолчанию на многих машинах.

объяснение

правильный аргумент

1+ добавить 1 к нему

?⍨генерировать числа 0 .. 1+⊢-1 и случайным образом распределять их в массиве, чтобы никакие два числа не повторялись


2

q / kdb +, 11 байт

Решение:

{(0-x)?1+x}

Пример:

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

Объяснение:

Используйте ? оператор с отрицательным вводом, чтобы получить полный список 0->nбез дубликатов:

{(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 байт (скучно)

randIntNoRep(0,Ans

Да, встроенный. randIntNoRep(это двухбайтовый токен, и Ansэто один байт.

Веселее, 34 байта:

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

Прямо из тибасичдева . Возможно, игра в гольф, но я еще ничего не нашел.

Что это делает: сортирует случайный массив, перемещая элементы второго аргумента ( L₁здесь) так же, как и соответствующие им элементы.


1

JavaScript (ES6), 51 байт

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

2
Я не думаю, что это единообразно; Я пробовал f(5)10 раз и 5был одним из последних двух пунктов каждый раз.
ETHproductions

Просто запустил его снова пару раз и получил 1,5,4,0,2,3& 1,0,2,5,3,4. РЕДАКТИРОВАТЬ: И еще несколько prnt.sc/fe0goe
Shaggy

3
Просто запустил быстрый тест, который запускается f(5)1-5 раз и находит среднюю позицию каждого числа в результатах. Полученный массив был [ 1.42791, 1.43701, 2.00557, 2.6979, 3.3993, 4.03231 ], так что я не думаю, что он однороден. ( код )
ETHproductions

Я думаю, что у меня есть 93-байтовое решение, которое могло бы работать. n=>(a=[...Array(n).keys(),n++]).reduce((a,v,i)=>([a[i],a[j]]=[a[j=n*Math.random()|0],v],a),a)?
kamoroso94

Сортировка по результату random()не равномерна. См. (Например) en.wikipedia.org/wiki/BrowserChoice.eu#Criticism
Нил

1

Ацето , 15 14 16 байтов

@lXp
Y!`n
zi&
0r

Вставьте ноль в стек, прочитайте целое число, создайте диапазон и перемешайте его:

Y
zi
0r

Установите метку, длину теста для 0 и (в этом случае) выход:

@lX
 !`

В противном случае выведите значение, символ новой строки и вернитесь к тесту длины:

   p
   n
  &

(Мне пришлось изменить код, потому что я понял, что неправильно понял вопрос, и построил диапазон от 1-n, а не 0-n.)




1

8 , 42 36 34 байта

Код

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

SED (диаграмма эффекта стека) n -- a

Использование и пример

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

1

Javascript (ES6), 68 байт

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

Создает массив формы

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

Затем сортирует и возвращает последние элементы в новом порядке.


1

J 11 байт

(?@!A.i.)>:

Объяснение:

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

Примеры:

    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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.