2016-02-10 34 views
9

私はいくつかのソートアルゴリズムを実行していました。ソートアルゴリズムを実行するさまざまな種類のリストを生成するテスト関数を実行したいと思います。Pythonリスト内の特定の数の項目を無作為に移動

そのようなリストは、リスト内の項目の数nは、ランダムに周りにシャッフルされています(すべてではなく、それらのリストはまだn個の項目以外にソートされなければならない)、既にソートされたリスト、

だろう

testlist = random.sample(range(0,10),10) 
testlist.sort() 

これは私のサイズ10のユニークなアイテムのソートされたリストを与えるが、その後、私はちょうど

をソートアップミックスする、ランダムな位置にリストの周りにこれら10項目の Nを移動について移動する方法がわかりませんよ
+0

なぜ** n ** **を移動することが重要ですか?ランダムリストを生成してコードに渡し、 'testlist.sort()'を呼び出して、その後に「正しい」値を生成するように思えます。 –

+0

あなたはそれらを移動する必要がありますか、それを再生するには十分でしょうか? – Prune

+0

@AustinHastings私はすでにそれをやろうと思っていますが、基本的にソートされたリスト、逆ソートされたリスト、ランダムにソートされたさまざまなリストの多くの一般的なソートアルゴリズムのランタイムを比較しています。いくつかの要素が移動されたソートされたリストは、ランタイムに関して完全にソートされたリストと比較したいものです。 – Woooooooooooooow

答えて

5

リスト内の一部の項目をシャッフルする方法の1つは

です
import random 
import numpy as np 

# Make a sorted list of integers. 
x = np.array(range(100)) 

# Choose 10 indices at random. 
r = random.sample(range(len(x)), 10) 

# Copy this list and shuffle. 
s = r.copy() 
random.shuffle(s) 

# Replace the indices with the shuffled ones. 
x[r] = x[s] 

これは、一部のインデックスを変更しないままにすることがあります。

+0

これは実際にそれを実装するための本当に面白い方法です – Woooooooooooooow

2

このようなものが動作します。基本的には、ランダムに2つのインデックスを選択し、それらを切り替え、同じインデックスを2回以上切り替えることはありません。ソートされた配列で実行される場合、正確にn要素がソートされていないことが保証されます。しかし、偶数回の置換えでしか動作しません。

array = list(range(10)) 

def shuffle_n(array, n): 
    assert n <= len(array) and n % 2 == 0 
    indexes = set(range(len(array))) 
    for i in range(n // 2): 
     a, b = random.sample(indexes, 2) 
     indexes.remove(a) 
     indexes.remove(b) 
     array[a], array[b] = array[b], array[a] 
3

ここには制御された実装があります。 ランダムに4つのインデックスを選択して切り替えます。それらの値をシャッフルし、4つの指定された場所に戻します。新しい値がすべて異なることを保証するものではありません。

import random 
import copy 

testlist = random.sample(range(0, 20), 10) 
testlist.sort() 
print testlist 

n = 4 
move_set = set() 
while len(move_set) < n: 
    move_set.add(random.randrange(0, 10)) 

print move_set 
move_list = list(move_set) 

# Replace n elements 
test1 = copy.copy(testlist) 
migrant = [test1[_] for _ in move_set] 
random.shuffle(migrant) 
print migrant 
test_case = [] 
for i in range(n): 
    test1[move_list[i]] = migrant[i] 
print test1 

出力:この実行で

[0, 3, 4, 5, 7, 8, 9, 12, 16, 17] 
set([9, 3, 4, 5]) 
[5, 17, 8, 7] 
[0, 3, 4, 17, 8, 7, 9, 12, 16, 5] 

、それはすべての4つのインデックスが、リスト内の値であったことを唯一の偶然です。要素9,3,4および5はそれぞれ値17,5,7および8を有する。シャッフルは、4つのそれぞれを新しい場所に置きます。

関連する問題