2016-12-19 3 views
1
WORDS=("lorem","ipsum","python") 
words = random.choice(WORDS) 
correct = words 
length = 0 
while length <len(words): 
    i = random.randint(0,len(words)) 
    print(words[i],end=" ") 
    length +=1 

私は単語の文字がマッシュアップされるはずの単語のジャンブルゲームを作ろうとしています。 iが何度も同じ値を繰り返さないように条件を設定できるかどうか質問したかったpythonでrandom.randint()関数の条件を設定することはできますか?

何か助けていただければ幸いです。

+2

[shuffling-a-list-of-object-in-python](http://stackoverflow.com/questions/976882/shuffling-a-list-of-objects-in-python)助けてもらえるかもしれない –

+0

http: //stackoverflow.com/questions/306400/how-do-i-randomly-select-an-item-from-a-list-using-python –

+0

[N個のアイテムを不特定の長さのシーケンスからランダムに選択]の可能な複製http://stackoverflow.com/questions/9690009/pick-n-items-at-random-from-sequence-of-unknown-length) – frlan

答えて

2

random.shuffleで、シャフリングを使用することができます。たとえば、次のようになります

shuffled_words= [] 

for word in WORDS: 
    word_list = list(word) # Typecast `str` to `list` 
    random.shuffle(word_list) # shuffle the list 
    shuffled_words.append(''.join(word_list)) # join the list to make `str` 

値ホールドshuffled_wordsリストによって:

>>> import random 
>>> WORDS = ["lorem","ipsum","python"] # But you need `list` not `tuple`; 
             # tuples are immutable 
>>> random.shuffle(WORDS) 
>>> WORDS # List is shuffled 
['ipsum', 'python', 'lorem'] 

あなたが持っているタプル内の各単語をシャッフルするために、あなたは何をする必要がある

>>> shuffled_words 
['omelr', 'spmiu', 'pynhot'] 
+0

しかし、私はリスト内の項目ではなく、単語で文字を混乱させたい/ tuple –

+0

@EricWatson:チェックを編集する –

-1

ありませんが、まだ見ていない番号が得られるまでループすることができます:

import random 

WORDS = ("lorem", "ipsum", "python") 
words = random.choice(WORDS) 
correct = words 
length = 0 
seen = set() 
i = 0 
while length < len(words): 
    while i in seen: 
     i = random.randint(0, len(words)-1) 
    seen.add(i) 

    print(words[i], end=" ") 
    length += 1 

しかし、(コメンターが指摘したように)言葉の文字をシャッフルするためにはるかに効率的な方法があります:

import random 

WORDS = ("lorem", "ipsum", "python") 
word = random.choice(WORDS) 

charlist = list(word) 
random.shuffle(charlist) 
print(" ".join(charlist), end=" ") 
+0

申し訳ありませんが、私は初心者です。 set()がどのように機能するのか私に説明することができますか? –

+0

これはあまり効率的ではありません。最終的には、すでに見られているものを避けるために乱数をたくさん投げます。 –

+0

whileループがループするために "i in seen"が真になっている理由を教えてください –

1

は、(それがその場で動作しますので、リストを作成するrandom.shuffleニーズを使用して)random.sampleを使用:

shuffled = "".join(random.sample(words,len(words))) 

ところで:あなたのコードは、範囲外であるlen(words)を選ぶ可能性があるrandom.randintを使用しているため、クラッシュにバインドされています。 あなたは

+0

リストのコピーを作成してシャッフルすると、' join'を実行して 'len(words ) '' random.sample'によって返されたリスト上にあります。 –

+0

意見がもっと重要です。さらに、「サンプル」のユースケースは、サンプルを取っている人口よりも少数のアイテムが必要な場合です。 'sample 'は' shuffle'よりも遅いです。すでに見たアイテムを追跡するために別のセットを割り当てます。その結果、 'y = random.sample(x、len(x))'は 'y = x [:];を表現するには非効率的です。ランダム。シャッフル(y) ' – user4815162342

0

私はあなたとの意志の詳細は後で

from random import random 
from math import floor 

class FairDice(): 
    def __init__(self, sides = 6): 
     self.sides = sides 
     self.history = [] 
     self.last = None 
    def roll(self): 
     number = random() 
     roll = int(floor(number * self.sides)) + 1 
     return roll 

    def statefull_roll(self, remember = None): 
     while True: 
      roll = self.roll() 
      remember = self.sides if remember is None else remember 
      if len(self.history) >= remember: 
       return None 

      if roll not in self.history: 
       self.history.append(roll) 
       return roll 

    def forget_history(self): 
     self.history = [] 

    def forget_one(self): 
     self.history = self.history[1:] 

私はこのFairDiceクラスを作成しました使い方をかなり単純なクラスを書いたrandom.randrangeを選択している必要があります。 .roll()関数を呼び出すことによって、定期的なロールを行うことができます。または、statefull_roll()メソッドを呼び出すことで、ロールされたものを覚えているロールを実行できます。数字がない場合、Noneが返されます。履歴を忘れるようにforget_history()関数を呼び出すこともできます。

dice = FiarDice(25) #creates a 25 sided dice 

for x in range(10): 
    print("Regular Roll gives you: ", dice.roll()) 

for x in range(25): 
    print("Your sort of Roll gives you: ", dice.statefull_roll()) 

print (dice.statefull_roll()) # Should return none after exhausting all possible characters. 

dice.forget_history() # forgets that any value have been recorded at all 

それは5つのロールの後に文字を繰り返すように大丈夫だと言うことができます:ここで

は使い方の一例です。私は noneを追加しました。

roll = dice.statefull_roll(remember = 5) 

これは、あなたがしなければならないすべては...

if roll is None: 
    dice.forget_one() 
    roll = dice.statefull_roll(remember = 5) 

forget_oneはあなたの最も古いロールを忘れされた後、5つのロールの後にNoneを返します。

私が書いたことはそれほどではありませんが、動作し、ゲームでの使用に十分柔軟です。

関連する問題