配列のスカラーをランダム化します


14

配列にはすべての数値を0-n含める必要があります。数字は繰り返さないでください。ただし、それらはランダムな順序でなければなりません。

ルール

すべての標準規則と標準抜け穴が禁止されています

配列は擬似ランダムに生成する必要があります。可能なすべての順列は、等しい確率を持つ必要があります。

入力

n メタのI / O投稿で許可される方法。

出力

スクランブルされた数値の配列0-n


出力は改行で区切ることができますか?
DrnglVrgs

@Riley oppsごめんなさい。
クリストファー

@DrnglVrgsはい、できます
クリストファー

「数字」とは、「整数」を意味すると思いますか?
ザカリー

1
@KevinCruijssen IMOリスト=配列、ただし検索サポート付き。リストを使用してください
クリストファー

回答:




8

Pyth、3バイト

.Sh

デモンストレーション

.Sシャッフルです。暗黙的に入力整数nを範囲にキャストします[0, 1, ..., n-1]his +1であり、入力は暗黙的に取得されます。




5

Python 2、51バイト

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

オンラインでお試しください!

ありますrandom.shuffle()が、引数を返す代わりにその場で変更します...


あなたは、することができます使用random.shuffle
coinheringaahing caird

@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

CJam7 6バイト

Erik the Outgolferのおかげで1バイトが削除されました。

{),mr}

これは、スタックから整数を取得して結果で置き換える匿名ブロック(関数)です。オンラインでお試しください!

説明

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

{),mr}1バイトは短くないですか?
エリックアウトゴルファー

@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のおかげでバグ修正。@Jakobの
おかげで-4バイト。 を削除して-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égoireWoops ..これは、適切にチェックせずに投稿するだけで得られるものです。バグ修正(およびプロセスで4バイト保存)をありがとう
ケビンCruijssen

1
私は再び編集したのでまあ、3は実際には、自分自身を持つことは、別のバグを導入しました:>する必要があります>=
オリビエグレゴワール

1
-4バイト:aのStack代わりにa Vectorを使用し、ループをに変更しますfor(;n>=0;l.add(n--));。そして、を返すことjava.util.Listは間違いなく大丈夫です。
ヤコブ


2

3バイトまでゴルフできます。.S整数の引数ではと同じで.SU[0..n]としてコード化Uhできるので.SUh、使用できます.Sh
エリックアウトゴルファー

@EriktheOutgolferはヒントに感謝しますが、誰かがあなたが提案した解決策をすでに投稿しているので、これはこれのままにします。
カールカストール

まあ、それは別の答えであるべきかどうかの境界線ですが、それはitとしてカウントされると思うので、それが許可されていても、組み込みの置換だけだと考えますので、投稿したくありませんでした別ですが、isaacgはしました。
エリックアウトゴルファー

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

もちろん失敗しますが、入力範囲は問題に指定されていません。私をmallocにしないでください:)
Computronium

aより規則に合うようにパラに変更しますか?
l4m2


2

、33バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。

どうやら、Charcoalのリストから要素を削除するには17バイトかかります。

編集:最近では、リストからアイテムのすべての出現を削除することを想定して、3バイトしかかかりません。これに加えて、他のチャコールの変更により、回答が21バイトに削減されました。オンラインで試してください!


たくさんのヤク
クリストファー


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(は2バイトのトークンであり、Ans1バイトです。

もっと楽しく、34バイト:

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

tibasicdevから直接。おそらくゴルフはできますが、私はまだ何も見つけていません。

これがすること:ランダム配列をソートし、2番目の引数(L₁ここ)の要素を対応する要素と同じ方法で移動します。


1

JavaScript(ES6)、51バイト

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

2
これは均一ではないと思います。私はf(5)10回試してみました5が、毎回最後の2つの項目の1つです。
ETHproductions

数回自分でもう一度実行して、1,5,4,0,2,3&を取得しました1,0,2,5,3,4。編集:そして、さらにいくつかのprnt.sc/fe0goe
シャギー

3
f(5)1e5回実行するクイックテストを実行し、結果の各数値の平均位置を見つけるだけです。結果の配列は[ 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
Neil

1

Aceto15 14 16バイト

@lXp
Y!`n
zi&
0r

スタックにゼロをプッシュし、整数を読み取り、範囲を構築してシャッフルします。

Y
zi
0r

キャッチマークを設定し、0の長さをテストし、(その場合)終了します。

@lX
 !`

それ以外の場合は、値と改行を出力し、長さテストに戻ります。

   p
   n
  &

(質問を誤解し、0-nではなく1-nの範囲を構築したことに気付いたため、コードを変更する必要がありました。)




1

8日、42 36 34バイト

コード

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

SED(Stack Effect Diagram)は 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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.