質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

3回答

1766閲覧

リスト内からランダムに要素を選択する際に確率を重み付けしたいです

yuum

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/05/28 09:07

編集2022/01/12 10:55

リスト内からランダムに要素を選択する際に確率を重み付けしたいです。この際に重複しないようにするrandom.sample()を用いたいです。
ランダムシャッフルする際にある一定の要素は比較的最初に並ぶようにし、他のある要素は比較的後ろに並ぶようにしたいです。

例:57,58,59,60を前に持っていきたいとき
70,101,103を後ろに持っていきたいとき
list = [16,29,35,55,57,58,59,60,61,62,63,64,69,70,72,101,103]
→list = [72,59,58,57,60,29,35,16,55,63,62,64,69,70,103,101,72]

python

1 2import random 3list = [16,29,35,55,57,58,59,60,61,62,63,64,69,70,72,101,103]#listの要素に重み付けをしたい 4 5n = int(input()) 6 7for _ in range(n): 8 random.shuffle(list) 9 print(list) 10 11 zf = id_worker[:2] 12 13 st = id_worker[2:4] 14 15 del list[:4] 16 print(list) 17

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/05/28 09:11

どんな重みの確率を付けたいんですか?
yuum

2018/05/28 09:14 編集

リスト内のある要素がランダムでシャッフルされる際に比較的最初のほうに並ぶ確率です。
hayataka2049

2018/05/28 09:16

具体的な例を示して頂けると回答しやすいです
yuum

2018/05/28 09:19

例としては、リスト内要素の57,58,59,60をシャッフル後のリスト内の順番で前にだし、69,70,72を前に出にくい状況を作りたいです。
hayataka2049

2018/05/28 09:21

ある程度は元の順番を保ちつつ、適度にシャッフルを行いたいということでしょうか
yuum

2018/05/28 09:24

いいえ。完全に元の状態は無視してシャッフルしていいです。しかし先ほどの例のように指定した要素達は順番が前後するようにしたいです。
hayataka2049

2018/05/28 09:27 編集

すぐには思いつかないので考えてみます。あと、コメントに書いた情報は見やすいようにまとめて、質問に追記しておくと良いですよ
yuum

2018/05/28 09:27

ありがとうございます!かしこまりました。
mather

2018/05/28 09:28

ソースコードが別の質問とかなり混じっててわかりにくいですね。今回の質問で確認したい部分だけに絞って整理できないですか?
puroko3

2018/05/28 09:32

リストをシャッフルすると数字が小さいものかもしくはインデックスが小さいものが前に来る確率を高めたいという事ですか?
yuum

2018/05/28 09:34

ではなくこちらが指定した要素です
mather

2018/05/28 09:37

「前に持っていきたい要素」が「後ろに持っていきたい要素」より必ず前にある状態を作りたいということですか?質問の意図が読みにくいです。
Lhankor_Mhy

2018/05/28 10:15

その重みはどのように表現されていますか? 関数化されているのでしょうか?
guest

回答3

0

最初に並ぶもの同士および後ろに並ぶもの同士は、一様分布と仮定すると以下のようなコードになると思います。

python

1lists= [1,2,3,4,5,6] # 選択されるリスト 2weight1 = np.array([10,10,10,5,5,5]) # 選択の重み付け(前半部) 3weight1 = weight1 / np.sum(weight1) # 全体で1.0となるように換算 4res1 = np.random.choice(lists,size=3,replace=False,p=weight1) # 前半分の3つを選択 5 6weight2 = np.array([5,5,5,10,10,10]) # 後半部の重み付け 7weight2 = weight2 / np.sum(weight2) 8res2 = np.random.choice(lists,size=4,replace=False,p=weight2)

なお、この方法だと、res1とres2は独立なので重なることが起きます。したがって、上記を実施したのちに重なりのチェックを行い、重なる場合は所定のルールで再選択をコードにする必要があります。

投稿2018/05/28 13:13

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

次のようなアルゴリズムを考えてみました。

1.まず条件に応じて数字(リストの要素)に値を割り振る

  • 比較的前に置きたい要素

平均-u標準偏差sの正規分布から取った値を振る

  • 比較的後ろに置きたい要素

平均u標準偏差sの正規分布から取った値を振る

  • どちらでもない要素

平均0標準偏差sの正規分布から取った値を振る

2. その値に基いて昇順ソートする
3. 元の値を取り出す

それなりに期待通り動きますし、平均と標準偏差を変えることでどの程度前後に偏るかを調整できます。

python

1import random 2 3def f(x, a={57,58,59,60}, b={70,101,103}, u=1, s=1): 4 if x in a: 5 return random.gauss(-u, s) 6 elif x in b: 7 return random.gauss(u, s) 8 else: 9 return random.gauss(0, s) 10 11lst = [16,29,35,55,57,58,59,60,61,62,63,64,69,70,72,101,103] 12result = [x[1] for x in sorted([(f(x), x) for x in lst], key=lambda x:x[0])] 13print(result)

投稿2018/05/28 11:28

編集2018/05/28 11:37
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

おそらくこれだろうと思う答えは実装してみたのですが、質問者自身が他の質問でも全く同じコードを提示していたことからも解く努力をしていないと感じたので、ヒントだけお伝えします。

  • 前に持っていきたいリスト、後ろに持っていきたいリスト、どちらにも含まれないリストを作る
  • どのリストをから要素を選択するか、ランダムに決める。このときに重み付けをする。
  • 選んだリストから、ランダムに要素を取り出す。取り出した要素はリストから削除する。
  • 取り出した要素を結果のリストの後ろに追加する。
  • 結果のリストの長さが元のリストの長さになる、または、全部のリストが空になるまで繰り返す。

こういうことでしょうか。

投稿2018/05/28 11:01

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問