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

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

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

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

Q&A

解決済

3回答

1849閲覧

[python]複数のランダムな座標にランダムな間隔を与えたい

mona_beginner

総合スコア33

Python

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

0グッド

0クリップ

投稿2022/01/25 07:07

編集2022/01/25 08:51

前提・実現したいこと

座標を10地点生成したい。
各地点X,Y軸方向にそれぞれ5以上のランダムな間隔を空けたい。
例)S1=[10,20] S2=[17,26] S3=[5,45]・・・

該当のソースコード

python

1#座標のランダム生成 2def make_built(zupper): 3 X=random.randint(0,zupper) 4 Y=random.randint(0,zupper) 5 return[X,Y] 6 7S=[] 8m=10 9#入力 10for _ in range(m): 11 S.append(make_built(zupper)) 12#出力 13print("施設情報 座標(X,Y)") 14print(S) 15

試したこと

make_built()内を以下のように変更してみたが、S1座標生成時のzはS2座標生成時に干渉しないので意味がなかった。

python

1def make_built(zupper): 2 z=random.randint(5,79)#5以上79以下の間隔 3 X=random.randrange(0,zupper,z) 4 Y=random.randrange(0,zupper,z) 5 return[X,Y]

追記:グラフ描画

python

1bX=[] 2bY=[] 3m=10#施設数 4for i in range(0,m):#施設 5 bX=S[i][0] 6 bY=S[i][1] 7 plt.scatter(bX,bY,s=30,color="blue") 8 9plt.title("city") 10plt.axis('scaled')#scaledで尺度の調整 11plt.grid()#グリッド=升目の表示 12plt.xlim([-10,90]) 13plt.ylim([-10,90]) 14plt.show()

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

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

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

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

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

shiracamus

2022/01/25 07:34

座標の最大値はありますか?
guest

回答3

0

py

1import random 2 3def random_points(n, gap): 4 point = 0 5 for _ in range(n): 6 point += random.choice(gap) 7 yield point 8 9 10x = list(random_points(10, range(5, 80))) 11y = list(random_points(10, range(5, 80))) 12random.shuffle(x) 13random.shuffle(y) 14s = list(zip(x, y)) 15print(s)
[(276, 41), (529, 267), (392, 92), (96, 229), (71, 167), (316, 240), (505, 378), (447, 333), (214, 366), (157, 133)]

投稿2022/01/25 08:09

shiracamus

総合スコア5406

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

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

mona_beginner

2022/01/25 08:49

回答ありがとうございます。座標の上限値は80で設定したいのですがどこに代入すればいいのでしょうか...?また、求めた座標から散布図として表示させたい(質問に追記しました)のですがlistの扱いが分からず難航しています。重ねての質問になり大変申し訳ないのですが、ご回答いただければ幸いです。
shiracamus

2022/01/25 09:06 編集

5から80までのランダムな間隔で座標を作るようにしてみました。 なので最短 5*10 から 最大 80 * 10 までの座標値になります。 座標値の最大が80ということであれば、間隔は 5~8 ですから、range(5, 80) を range(5, 9) にすればいいです。 最初の座標位置も5~8になっていまうので、最初の座標値 を 0 ではなくランダムで選ぶようにする必要があるかもしれません。
shiracamus

2022/01/25 09:14

私の方法だと座標0側に座標値が寄ってしまうので、望む方法ではないかもしれません。
guest

0

ベストアンサー

各地点X,Y軸方向にそれぞれ5以上のランダムな間隔を空けたい。
というのは、すべての点が互いに5以上離れているというように理解しました。

単純に乱数をとって、すでに出ている点から離れている点を取るというアルゴリズムだと、以下になります。

python

1>>> import random 2>>>>>> used_list = [] 3>>> def rand_point(used_list, distance=5, minmum=0, maximum=200): 4... while True: 5... point = (random.randint(minmum, maximum), random.randint(minmum, maximum)) 6... for p in used_list: 7... if (abs(point[0] - p[0]) < 5) or (abs(point[1] - p[1]) < 5): 8... break 9... else: 10... used_list.append(point) 11... return point 12... 13>>> for i in range(20): 14... print(rand_point(used_list=used_list)) 15... 16(34, 36) 17(103, 159) 18(169, 87) 19(145, 173) 20(157, 41) 21(194, 128) 22(53, 54) 23(189, 196) 24(70, 9) 25(87, 46) 26(14, 81) 27(183, 145) 28(61, 104) 29(131, 180) 30(81, 97) 31(118, 139) 32(5, 70) 33(150, 168) 34(125, 116) 35(27, 191)```

投稿2022/01/25 08:58

ppaul

総合スコア24666

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

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

0

python

1import random 2 3points = [(x, y) for x in range(5, 80, 5) for y in range(5, 80, 5)] 4selected = random.sample(points, 10) 5 6from pprint import pprint 7pprint(selected) 8 9# 10[(5, 10), 11 (60, 70), 12 (65, 65), 13 (55, 70), 14 (10, 25), 15 (60, 50), 16 (40, 25), 17 (10, 50), 18 (45, 25), 19 (55, 40)]

投稿2022/01/25 07:49

melian

総合スコア19803

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問