質問

この時期であることを再プログラムというシャッフルリストなどの要素に存在する元の位置に少なくとも、オランダのお祝い Sinterklaas 車の藁を決定する人に書き込み方詩).は誰にもPython シングルの声 しょうか。

なので、入力例: range(10)

出力例: [2,8,4,1,3,7,5,9,6,0]

間違いを出力する [2,8,4,1,3,5,7,9,6,0] なので 5 は元の位置にします。この意味その人5書の詩のように自分自身が楽しいです。

編集 多くの人が繰り返しの課題で行上必要な限りにおいて、を get lucky 見と解決にはしっかりとできている。することが、勝利へのアプローチとして理論的にはこれまで無限に長い。のよりよいアプローチが示唆されるBartができませんがoneliner別...

編集 によるonelinerというのは、 シングルの声.表示されているとおり、Pythonにも圧縮複数の計算書単線です。知らなかった。現在、非常に良のソリューションのセミコロンを再現する複数行の行動は、シングルライン。そのため:"できるだけでシングル。"

役に立ちましたか?

解決

私はシャッフルがこれを解決するに悪用される可能性が見つかった。

from random import shuffle
L = ["Anne", "Beth", "Cath", "Dave", "Emma"]
shuffle(L, int=lambda n: int(n - 1))
print L

の分布は、しかし、これは必要条件ではなかった均一ではない。

#For 100,000 samples

(('Beth', 'Cath', 'Dave', 'Emma', 'Anne'), 13417)
(('Beth', 'Cath', 'Emma', 'Anne', 'Dave'), 6572)
(('Beth', 'Dave', 'Anne', 'Emma', 'Cath'), 3417)
(('Beth', 'Dave', 'Emma', 'Cath', 'Anne'), 6581)
(('Beth', 'Emma', 'Anne', 'Cath', 'Dave'), 3364)
(('Beth', 'Emma', 'Dave', 'Anne', 'Cath'), 6635)
(('Cath', 'Anne', 'Dave', 'Emma', 'Beth'), 1703)
(('Cath', 'Anne', 'Emma', 'Beth', 'Dave'), 1705)
(('Cath', 'Dave', 'Beth', 'Emma', 'Anne'), 6583)
(('Cath', 'Dave', 'Emma', 'Anne', 'Beth'), 3286)
(('Cath', 'Emma', 'Beth', 'Anne', 'Dave'), 3325)
(('Cath', 'Emma', 'Dave', 'Beth', 'Anne'), 3421)
(('Dave', 'Anne', 'Beth', 'Emma', 'Cath'), 1653)
(('Dave', 'Anne', 'Emma', 'Cath', 'Beth'), 1664)
(('Dave', 'Cath', 'Anne', 'Emma', 'Beth'), 3349)
(('Dave', 'Cath', 'Emma', 'Beth', 'Anne'), 6727)
(('Dave', 'Emma', 'Anne', 'Beth', 'Cath'), 3319)
(('Dave', 'Emma', 'Beth', 'Cath', 'Anne'), 3323)
(('Emma', 'Anne', 'Beth', 'Cath', 'Dave'), 1682)
(('Emma', 'Anne', 'Dave', 'Beth', 'Cath'), 1656)
(('Emma', 'Cath', 'Anne', 'Beth', 'Dave'), 3276)
(('Emma', 'Cath', 'Dave', 'Anne', 'Beth'), 6638)
(('Emma', 'Dave', 'Anne', 'Cath', 'Beth'), 3358)
(('Emma', 'Dave', 'Beth', 'Anne', 'Cath'), 3346)
均一な分布のために、この(より長い)のバージョンを使用することができる。

from random import shuffle,randint
L=["Anne", "Beth", "Cath", "Dave", "Emma"]
shuffle(L, random=lambda: 1, int=lambda n: randint(0, n - 2))
print L

# For 100,000 samples

(('Beth', 'Cath', 'Dave', 'Emma', 'Anne'), 4157)
(('Beth', 'Cath', 'Emma', 'Anne', 'Dave'), 4155)
(('Beth', 'Dave', 'Anne', 'Emma', 'Cath'), 4099)
(('Beth', 'Dave', 'Emma', 'Cath', 'Anne'), 4141)
(('Beth', 'Emma', 'Anne', 'Cath', 'Dave'), 4243)
(('Beth', 'Emma', 'Dave', 'Anne', 'Cath'), 4208)
(('Cath', 'Anne', 'Dave', 'Emma', 'Beth'), 4219)
(('Cath', 'Anne', 'Emma', 'Beth', 'Dave'), 4087)
(('Cath', 'Dave', 'Beth', 'Emma', 'Anne'), 4117)
(('Cath', 'Dave', 'Emma', 'Anne', 'Beth'), 4127)
(('Cath', 'Emma', 'Beth', 'Anne', 'Dave'), 4198)
(('Cath', 'Emma', 'Dave', 'Beth', 'Anne'), 4210)
(('Dave', 'Anne', 'Beth', 'Emma', 'Cath'), 4179)
(('Dave', 'Anne', 'Emma', 'Cath', 'Beth'), 4119)
(('Dave', 'Cath', 'Anne', 'Emma', 'Beth'), 4143)
(('Dave', 'Cath', 'Emma', 'Beth', 'Anne'), 4203)
(('Dave', 'Emma', 'Anne', 'Beth', 'Cath'), 4252)
(('Dave', 'Emma', 'Beth', 'Cath', 'Anne'), 4159)
(('Emma', 'Anne', 'Beth', 'Cath', 'Dave'), 4193)
(('Emma', 'Anne', 'Dave', 'Beth', 'Cath'), 4177)
(('Emma', 'Cath', 'Anne', 'Beth', 'Dave'), 4087)
(('Emma', 'Cath', 'Dave', 'Anne', 'Beth'), 4150)
(('Emma', 'Dave', 'Anne', 'Cath', 'Beth'), 4268)
(('Emma', 'Dave', 'Beth', 'Anne', 'Cath'), 4109)

をどのように動作する

ここでrandom.shuffle()ためのコード

def shuffle(self, x, random=None, int=int):
    """x, random=random.random -> shuffle list x in place; return None.

    Optional arg random is a 0-argument function returning a random
    float in [0.0, 1.0); by default, the standard random.random.
    """

    if random is None:
        random = self.random
    for i in reversed(xrange(1, len(x))):
        # pick an element in x[:i+1] with which to exchange x[i]
        j = int(random() * (i+1))
        x[i], x[j] = x[j], x[i]

j = int(random() * (i+1))を標的とすることにより、両方の溶液の作業

(不均一な)

最初は効果

このようなライン作業を行います
j = int(random() * (i + 1) - 1)

我々が得たので、代わりに(1..i)の範囲(0..i-1)

第2の解決策は、常に1を返す関数とrandom()を置き換え、そしてrandintの代わりintを使用します。行は次のように動作しますので、

j = randint(0, i - 1)

他のヒント

番号のリストをシャッフルした後、[i]th人は詩を書いてみましょう(そして本を買って!)、リスト内の[i+1]th人のために:そのように、him-自身を描く、誰かがそこになることはありません。もちろん、最後の1が最初に指している必要があります...

移動の全ての要素がリストにより円形方法 このようにBart, は簡単です:

>>> def shift(seq):
...     return seq[-1:] + seq[:-1]
... 
>>> shift(range(10))
[9, 0, 1, 2, 3, 4, 5, 6, 7, 8]

そして、ランダム溶液:この場合、請求めのライナーはいないが、明らかな機能、すなわち random.shuffle, し、そのタスクです。言い換えればこの 側面の効果, かつ、通常とは避け、リストの理解.があることが、 ポール ポイント、すなわち用 random.sample.次のコードすることができます。一-ライナーを使用するこれらの機能の利用 not shuffle, では、仕事のこと shuffle を返します None...):

>>> from itertools import repeat
>>> from random import shuffle
>>> def shake_it(seq):
...     return next(c for c in repeat(seq[::]) if not shuffle(c) and all(a != b for a, b in zip(seq, c)))
... 
>>> shake_it(range(10))
[7, 9, 0, 2, 6, 8, 5, 1, 4, 3]
>>> 
>>> from itertools import count
>>> from random import sample
>>> def shake_it(seq):
...     return next(c for c in (sample(seq, len(seq)) for _ in count()) if all(a != b for a, b in zip(seq, c)))
... 
>>> shake_it(range(10))
[1, 3, 9, 5, 2, 6, 8, 4, 0, 7]

私自身はまっす:

>>> def shake_it(seq):
...     res = seq[::]
...     while any(a == b for a, b in zip(res, seq)):
...         shuffle(res)
...     return res
... 
>>> shake_it(range(10))
[5, 7, 9, 2, 6, 8, 3, 0, 4, 1]

ここでは、O(n)の時間とO(1)余分なメモリでそれを行う方法です

わかりやすいコード:

def shuffle(a)
  n = a.length
  (0..n - 2).each do |i|
    r = rand(n - i - 1) + i + 1
    a[r], a[i] = a[i], a[r]
  end
  a
end

ワンライナー(「」配列であると仮定)。

n = a.length and (0..n - 2).each {|i| r = rand(n - i - 1) + i + 1; a[r], a[i] = a[i], a[r]}

コードはルビーであるが、何の疑いもせずに、それは

のpythonに簡単に翻訳可能です

乾杯

P.S:溶液は、配列を変更します。

"ワン-ライナー"の固定にはO(n)時間:

import random; a=range(10)  # setup (could read in names instead)
for i in range(len(a)-1,0,-1): j=random.randint(0,i-1); a[j],a[i]=a[i],a[j]
print a  # output

ループをピックの要素からの最高指数len(a)-1)を、最小の(1).のプール要素のkのみが含まれの指標が0-k-1;一度出し、要素になれます。

後にスクランブルは、素子に住むことができ、その元の位置が

  • 場合は要素jは一部のスロットi>jので、他の人の評価通り良いホテル
  • その他、要素jを入れ替えとその他の要素からのスロットi
  • 以外の要素にスロットに0を入れ替え無条件の要素にスロット1(最後の繰り返しループの場合でない現状です。

[編集:これは論理的に等価なRubyの答えだと思い]

この1つはO(N)です。ループ内でインポートを持つことは少し愚かですが、

1つのライナーを望んでいました
L=range(10)
for i in range(1,len(L)):import random;r=random.randint(0,i-1);L[i],L[r]=L[r],L[i]
print L

ここで出力分布がある場合にL =範囲(5)100000個のサンプルについて

((1, 2, 3, 4, 0), 4231)
((1, 2, 4, 0, 3), 4115)
((1, 3, 0, 4, 2), 4151)
((1, 3, 4, 2, 0), 4108)
((1, 4, 0, 2, 3), 4254)
((1, 4, 3, 0, 2), 4101)
((2, 0, 3, 4, 1), 4158)
((2, 0, 4, 1, 3), 4177)
((2, 3, 1, 4, 0), 4190)
((2, 3, 4, 0, 1), 4117)
((2, 4, 1, 0, 3), 4194)
((2, 4, 3, 1, 0), 4205)
((3, 0, 1, 4, 2), 4325)
((3, 0, 4, 2, 1), 4109)
((3, 2, 0, 4, 1), 4131)
((3, 2, 4, 1, 0), 4153)
((3, 4, 0, 1, 2), 4081)
((3, 4, 1, 2, 0), 4118)
((4, 0, 1, 2, 3), 4294)
((4, 0, 3, 1, 2), 4167)
((4, 2, 0, 1, 3), 4220)
((4, 2, 3, 0, 1), 4179)
((4, 3, 0, 2, 1), 4090)
((4, 3, 1, 0, 2), 4132)
長い間における

私の最初のPythonプログラム。上記プログラムの多くとは異なり、これはO(n)の時間がかかります。

s = set(range(10))
r = list()
for i in range(10):
    s2 = s - set([i])
    val = s2.pop()
    r.append(val)
    s.discard(val)

print r

UPDATE の:ポールは、上記のプログラムが間違っていたことを示しました。おかげで、ポール。ここでは、同じプログラムの異なる、より良いバージョンがあります:

s = range(10)
for i in range(9):
    r = random.randrange(i+1, 10)
    s[i], s[r] = s[r], s[i]

print s

申し訳ありませんが、これはワンライナーではありませんが、これは動作します。

import random
def sinterklaas(n):
    l=[]
    for a in range(n):
        l.append(-1)

    i = 0
    while i < 10:
        index = random.randint(0,n-1)
        if l[index] == -1 and index != i:
        l[index] = i
            i += 1

乾杯

import random; u = range(10)
while sum(u[i]==i for i in range(10)): random.shuffle(u)

タグ([OK]を、私は...あまりにもそこにライン0を持っています)

O(n)の中の1つの場合:

u=range(10); random.shuffle(u); v=[ u[u[i]] for i in range(10) ]; return [ v[(u[i]+1)%10] for i in u ]

u関数vの逆数であるので、v[u[i]+1]を効果的配列v Iに次の要素である。

ここStephan202の循環シフトは、ランダムに選択されたシフトインクリメントとワンライナーとして実装されます。

from random import randrange; s = range(10); r = randrange(1,len(s)-1); print s[-r:] + s[:-r]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top