☆☆ 新着記事 ☆☆

2018年10月16日火曜日

Python random function の使い方 - randint, choice(), shuffle()


◇ ランダムな数字のリストを作成
list1 = [random.randint(0,99) for i in range(10)]
list2 = [random.randint(100,199) for i in range(10)]
list3 = [random.randint(200,299) for i in range(10)]

print(list1)
print(list2)
print(list3)

[42, 0, 98, 45, 43, 34, 55, 85, 95, 98]                                                
[133, 123, 101, 197, 114, 130, 142, 192, 146, 187]                                     
[268, 223, 284, 201, 286, 223, 228, 230, 288, 218]          


◆リストとランダム

choice()は要素を一つ取得、sample(), choices()は複数の要素をリストで取得できる。
sample()は重複なしの非復元抽出、choices()は重複ありの復元抽出。

random is giji ransu being created by the system clock.
Therefore, if system clock provides the same time, random will also create same order of numbers,.


sample of random func.

import random
list = [1,2,3,4,5,6,7,8,9,10]
random_l = random.sample(list,len(list))
print("Content-type: text/html\n")
print("<html><body>")
print(random_l)
print("</body></html>")

◆辞書型(dictionary)のシャッフル

◇keyを指定して、要素(Value)を並べ替える

from random import shuffle

questions = {
'1': {'tip': '1', 'answer': '1', 'question': '1?', 'options': ['1', '2', '3', '4']},
'2': {'tip': '2', 'answer': '2', 'question': '2?', 'options': ['1', '2', '3', '4']},
'3': {'tip': '3', 'answer': '3', 'question': '3?', 'options': ['1', '2', '3', '4']},
'4': {'tip': '4', 'answer': '4', 'question': '4?', 'options': ['1', '2', '3', '4']},
'5': {'tip': '5', 'answer': '5', 'question': '5?', 'options': ['1', '2', '3', '4']}}
for item in questions.keys():
  shuffle(questions[item]['options']) 

print(questions)

{'1': {'tip': '1', 'answer': '1', 'question': '1?', 'options': ['3', '1', '2', '4']},
  '2': {'tip': '2', 'answer': '2', 'question': '2?', 'options': ['3', '2', '1', '4']},
  '3': {'tip': '3', 'answer': '3', 'question': '3?', 'options': ['4', '3', '1', '2']},
  '4': {'tip': '4', 'answer': '4', 'question': '4?', 'options': ['1', '4', '2', '3']},
  '5': {'tip': '5', 'answer': '5', 'question': '5?', 'options': ['4', '3', '1', '2']}}


◇関数を利用して順番を並べかえる

#1 パッケージのインポート
import random

#2 適当な辞書型(dict型)オブジェクトの作成
family = {
  "sazae":"サザエ",
  "katsuo":"カツオ",
  "masuo":"マスオ",
  "tara":"タラ",
  "hune":"フネ",
  "wakame":"ワカメ",
  "namihei":"波平",
  "tama":"タマ"
};
#3 辞書型オブジェクトをシャッフルできるメソッド
def shuffleDict(d):
  keys = list(d.keys())  <- Keyを取得してリスト化
  random.shuffle(keys) <- リスト化したkeyをシャッフル
  [(key, d[key]) for key in keys]
  random.shuffle(keys)
  [(key, d[key]) for key in keys]
  random.shuffle(keys)
  keys = [(key, d[key]) for key in keys]
  #keys = d(keys)
  return dict(keys)

#4 元の辞書型オブジェクト
print(family)

#5 シャッフル後の辞書型オブジェクト
print(shuffleDict(family))
{'katsuo': 'カツオ', 'wakame': 'ワカメ', 'masuo': 'マスオ', 'namihei': '波平', 'tara': 'タラ', 'hune': 'フネ', 'tama': 'タマ', 'sazae': 'サザエ'}

(使用例で確認)
import random
questions = {
 '1': {'tip': '1', 'answer': '1', 'question': '1?', 'options': ['1', '2', '3', '4']},
 '2': {'tip': '2', 'answer': '2', 'question': '2?', 'options': ['1', '2', '3', '4']},
 '3': {'tip': '3', 'answer': '3', 'question': '3?', 'options': ['1', '2', '3', '4']},
 '4': {'tip': '4', 'answer': '4', 'question': '4?', 'options': ['1', '2', '3', '4']},
 '5': {'tip': '5', 'answer': '5', 'question': '5?', 'options': ['1', '2', '3', '4']}}
def shuffleDict(d):
   keys = list(d.keys())
   random.shuffle(keys)
   [(key, d[key]) for key in keys]
   random.shuffle(keys)
   [(key, d[key]) for key in keys]
   random.shuffle(keys)
   keys = [(key, d[key]) for key in keys]
   #keys = d(keys)
   return dict(keys)
 
print(shuffleDict(questions))

{
'5': {'tip': '5', 'answer': '5', 'question': '5?', 'options': ['1', '2', '3', '4']},
'3': {'tip': '3', 'answer': '3', 'question': '3?', 'options': ['1', '2', '3', '4']},
'4': {'tip': '4', 'answer': '4', 'question': '4?', 'options': ['1', '2', '3', '4']},
'2': {'tip': '2', 'answer': '2', 'question': '2?', 'options': ['1', '2', '3', '4']},
'1': {'tip': '1', 'answer': '1', 'question': '1?', 'options': ['1', '2', '3', '4']}
}

*これでも良いのだが、keyの値を1とか2とか指定して要素にアクセスすると、結局、
 1~5までソートされた順列になってしまう

そこで、ランダムに要素を先にシャッフルした後で、keyとなる '1' ~'5' のインデックス番号は、
enumerate関数で後からつける。

*coding 例
import random

questions = (  ←この段階ではリスト
{'answer': '1', 'question': '1?', 'options': ['1', '2', '3', '4']},
{'answer': '2', 'question': '2?', 'options': ['1', '2', '3', '4']},
{'answer': '3', 'question': '3?', 'options': ['1', '2', '3', '4']},
{'answer': '4', 'question': '4?', 'options': ['1', '2', '3', '4']},
{'answer': '5', 'question': '5?', 'options': ['1', '2', '3', '4']
 )
   
keys = range(len(questions))

random_q=()

random_q = random.sample(questions,len(questions)) ←リストのランダム
print(random_q)
#output
[
{'answer': '4', 'question': '4?', 'options': ['1', '2', '3', '4']},
{'answer': '5', 'question': '5?', 'options': ['1', '2', '3', '4']},
{'answer': '1', 'question': '1?', 'options': ['1', '2', '3', '4']},
{'answer': '2', 'question': '2?', 'options': ['1', '2', '3', '4']},
{'answer': '3', 'question': '3?', 'options': ['1', '2', '3', '4']}
]

random_q2={}
random_q2=dict(list(enumerate(random_q,start=1)))←辞書型にしてインデックス番号付与
print(random_q2)
    
#output
#{
# 1: {'answer': '4', 'question': '4?', 'options': ['1', '2', '3', '4']},
# 2: {'answer': '5', 'question': '5?', 'options': ['1', '2', '3', '4']},
# 3: {'answer': '1', 'question': '1?', 'options': ['1', '2', '3', '4']},
# 4: {'answer': '2', 'question': '2?', 'options': ['1', '2', '3', '4']},
# 5: {'answer': '3', 'question': '3?', 'options': ['1', '2', '3', '4']}
# }




◇参考
>>> import random >>> d = {1:2, 3:4, 5:6, 7:8, 9:10}
>>> d {1: 2, 3: 4, 9: 10, 5: 6, 7: 8}
>>> keys = list(d.keys()) # Python 3; use keys = d.keys() in Python 2
>>> random.shuffle(keys)
>>> [(key, d[key]) for key in keys] [(1, 2), (5, 6), (7, 8), (9, 10), (3, 4)]
>>> random.shuffle(keys)
>>> [(key, d[key]) for key in keys] [(9, 10), (3, 4), (1, 2), (7, 8), (5, 6)]
>>> random.shuffle(keys) >>> [(key, d[key]) for key in keys] [(1, 2), (7, 8), (3, 4), (5, 6), (9, 10)]

0 件のコメント:

コメントを投稿