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

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

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

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

Q&A

解決済

1回答

852閲覧

Python vscode 実行した結果のターミナルへの表示表示

oNhZAMOGDKtDPbh

総合スコア5

Python

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

0グッド

0クリップ

投稿2021/08/29 13:04

編集2021/08/29 14:51

Python

1import random 2 3def rand_ints_nodup(a,b,c): 4 ns = [] 5 while len(ns) < c: 6 n = random.randint(a,b) 7 if not n in ns: 8 ns.append(n) 9 return ns 10print(rand_ints_nodup(1,40,40))

リンク内容
を参考にして重複しない乱数をターミナルに表示することができたのですが、この実行の結果をターミナルに表示するのではなく、座席表のような物に表示することはできるのでしょうか?また、そのやり方はどうすれば良いのでしょうか?

初心者で丸投げのような質問になってしまいましたが、答えていただけると嬉しいです。
イメージ説明
↑が理想です。

vscode pythonを使っています。

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

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

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

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

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

1T2R3M4

2021/08/29 13:07

提示されたコードだと IndentationError が出るので正しいコードに編集していただけませんか。
oNhZAMOGDKtDPbh

2021/08/29 13:14

多分正しいコードに編集できたと思います!
Daregada

2021/08/29 13:26

「import...」の直前の行に「```Python」だけからなる行を書き、 「print...」の直後の行に「```」だけからなる行を書いてください。
oNhZAMOGDKtDPbh

2021/08/29 13:36

わざわざありがとうございます。修正してみましたのでよろしくお願いします。
TakaiY

2021/08/29 13:54

「座席表のような物」というのは具体的にどういう表示を意図していますか?
guest

回答1

0

ベストアンサー

まず、リンク先のページに書いてあるrand_ints_nodupの性能そのものがよくないですね。

a以上b以下の疑似乱数を生成し、それまでの疑似乱数のリストに存在しなければ合計c個になるまでリストに追加する」というアルゴリズムなので、abの差が大きく、cの値がb - aに近いと、リストに値を追加するのに時間がかかるようになります。残りの値の候補が少ないのに、毎回a以上b以下の乱数を生成するからですね。

試しに、rand_ints_nodup(1, 10000, 10000)で実行時間を計測したら、私のPCでは5~10秒ほどかかっていました。後で示す別のコードだと、0.02秒前後で同様の結果が得られます。

重複しない乱数のリストを得るアルゴリズムは、「乱数のシャッフル」で検索すると見つかります。「フィッシャー–イェーツのシャッフル - Wikipedia」に、バリエーションも含めていろいろ載っています。

もっとも、Pythonで結果を得るには、randomモジュール自体にシャッフル用のメソッドが含まれているので、自分でアルゴリズムを実装する必要はありません。random.shufflerandom.sampleがそうです。

元になるリストとは別に、シャッフルされたリストを生成するrandom.sampleを使うと、先ほどのrand_ints_nodupは以下のように書けます(わざわざ関数にするほどではないのですが、比較用に)。

Python

1def rand_ints_nodup(a, b, c): 2 return random.sample(range(a, b + 1), c)

次に、「座席表のような物に表示する」方法ですが、単に縦・横に整理して表示するだけでよければ、

Python

1lst = rand_ints_nodup(1, 40, 40) 2 3n = 8 4for i, v in enumerate(lst): 5 print(f"{v:2d}", end='\n' if i % n == n - 1 else ' ') 6 7print()

のようにすれば、空白区切りで横n列に並べることができます。カンマ区切りに変更してCSVファイルとして保存することもできます。

result

121 33 6 26 31 10 3 27 2 9 25 36 7 17 19 4 38 329 8 5 18 12 39 24 30 432 1 16 14 40 11 37 2 535 13 20 34 15 28 23 22 6

投稿2021/08/29 14:30

編集2021/08/29 14:54
Daregada

総合スコア11990

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

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

oNhZAMOGDKtDPbh

2021/08/29 14:59

本当にありがとうございます!おかげで表示することが出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問