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

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

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

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

Q&A

解決済

3回答

215閲覧

乱数がうまく機能していないのか?

suugaku_nyumon

総合スコア37

Python

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

0グッド

0クリップ

投稿2018/12/05 05:17

編集2018/12/05 05:31

質問

前回の質問で最後だと書きましたが、さらに1つ問題が発生したので質問したいと思います。すみません。これで最後にします。先ほど質問文を変更しました。すみません。

初期条件で乱数を用いて20%の確率で紫が、40%の確率で赤が、40%の確率で青が出るように設定しましたが、何回試しても紫が初めに出てきません。初期条件の書き方はこれで正しいのでしょうか?それとも乱数がうまく機能していないのでしょうか?

そして、5番目のセルと15番目のセルをAの値を1にして、10番目のセルと20番目のセルをAの値を3にして、紫色にしたのち、その他のセルを50%でAの値を2にして赤色に、50%でAの値を4にして青色にする初期条件を書こうとしましたが、できませんでした。これはどうすればよいのでしょうか?

python3

1from tkinter import * 2import time 3import tkinter as tk 4import random 5import math 6#配列の宣言 7def array2(N1,N2): 8 return [[0 for j in range(N2)]for k in range(N1)] 9def array3(N1,N2,N3): 10 return [array2(N2,N3)for k in range(N1)] 11#セルの初期設定 12def initdt(): 13 A=array3(1000,31,31) 14 B=array3(1000,31,31) 15 for i in range(1,31): 16 r_i=random.random() 17 if (r_i <= 0.10): 18 A[0][i][15]=1 19 B[0][i][15]=1.0 20 if (r_i > 0.10 or r_i <= 0.20): 21 A[0][i][15]=3 22 B[0][i][15]=1.0 23 if (r_i > 0.20 or r_i <= 0.60): 24 A[0][i][15]=2 25 B[0][i][15]=0.1 26 if (r_i > 0.60): 27 A[0][i][15]=4 28 B[0][i][15]=0.1 29 return A , B 30#セルオートマトンの実行 31def execCell(A,B,i1): 32 i2 = 1 + i1 33 for i in range(1,30): 34 if A[i1][i][15] == 1: 35 B[i2][i][15] = 0.8 * B[i1][i][15] 36 if (0 <= B[i2][i][15] < 0.5): 37 A[i2][i][15] = 2 38 if (0.5 <= B[i2][i][15] <= 1): 39 A[i2][i][15] = 1 40 if A[i1][i][15] == 2: 41 if (A[i1][i-1][15] == 1 or 2) and (A[i1][i+1][15] == 1 or 2): 42 B[i2][i][15] = 0.8 * B[i1][i][15] + 0.25 * B[i1][i+1][15] + 0.25 * B[i1][i-1][15] 43 if (A[i1][i-1][15] == 3 or 4) and (A[i1][i+1][15] == 1 or 2): 44 B[i2][i][15] = 0.8 * B[i1][i][15] + 0.75 * B[i1][i-1][15] + 0.25 * B[i1][i+1][15] 45 if (A[i1][i-1][15] == 1 or 2) and (A[i1][i+1][15] == 3 or 4): 46 B[i2][i][15] = 0.8 * B[i1][i][15] + 0.25 * B[i1][i-1][15] + 0.75 * B[i1][i+1][15] 47 if (A[i1][i-1][15] == 3 or 4) and (A[i1][i+1][15] == 3 or 4): 48 B[i2][i][15] = 0.8 * B[i1][i][15] + 0.75 * B[i1][i-1][15] + 0.75 * B[i1][i+1][15] 49 if (0 <= B[i2][i][15] < 0.5): 50 A[i2][i][15] = 2 51 if (0.5 <= B[i2][i][15] <= 1): 52 A[i2][i][15] = 1 53 if (1.0 < B[i2][i][15]): 54 A[i2][i][15] = 1 55 B[i2][i][15] = 1.0 56 if A[i1][i][15] == 3: 57 B[i2][i][15] = 0.8 * B[i1][i][15] 58 if (0 <= B[i2][i][15] < 0.5): 59 A[i2][i][15] = 4 60 if (0.5 <= B[i2][i][15] <= 1): 61 A[i2][i][15] = 3 62 if A[i1][i][15] == 4: 63 if (A[i1][i-1][15] == 1 or 2) and (A[i1][i+1][15] == 1 or 2): 64 B[i2][i][15] = 0.8 * B[i1][i][15] + 0.10 * B[i1][i+1][15] + 0.10 * B[i1][i-1][15] 65 if (A[i1][i-1][15] == 3 or 4) and (A[i1][i+1][15] == 1 or 2): 66 B[i2][i][15] = 0.8 * B[i1][i][15] + 0.40 * B[i1][i-1][15] + 0.10 * B[i1][i+1][15] 67 if (A[i1][i-1][15] == 1 or 2) and (A[i1][i+1][15] == 3 or 4): 68 B[i2][i][15] = 0.8 * B[i1][i][15] + 0.10 * B[i1][i-1][15] + 0.40 * B[i1][i+1][15] 69 if (A[i1][i-1][15] == 3 or 4) and (A[i1][i+1][15] == 3 or 4): 70 B[i2][i][15] = 0.8 * B[i1][i][15] + 0.40 * B[i1][i-1][15] + 0.40 * B[i1][i+1][15] 71 if (0 <= B[i2][i][15] < 0.5): 72 A[i2][i][15] = 4 73 if (0.5 <= B[i2][i][15] <= 1): 74 A[i2][i][15] = 3 75 if (1.0 < B[i2][i][15]): 76 A[i2][i][15] = 3 77 B[i2][i][15] = 1.0 78#セルの位置決めとIDの設定 79def drawCell(canvas,A,k): 80 x2=0 81 CID=array2(31,31) 82 for i in range(1,30): 83 x1=x2 84 x2=x1+10 85 y2=0 86 for j in range(1,30): 87 y1=y2 88 y2=y1+10 89 CID[i][j]=canvas.create_rectangle(x1,y1,x2,y2,fill='black') 90 return CID 91#セルの色設定 92def modifyCell(canvas,A,k,CID): 93 CL=['black','#800080','#ff0000','#800080','#0000ff'] 94 for i in range(1,30): 95 for j in range(1,30): 96 canvas.itemconfig(CID[i][j],fill=CL[A[k][i][j]]) 97 canvas.itemconfig(CID[i][j],outline=CL[A[k][i][j]]) 98#Tk初期設定 99def initTk(): 100 tk=Tk(); tk.title("2D Cell Automaton"); tk.resizable(0,0) 101 return tk 102#画面キャプチャ用 103def leftMouseDown(event): 104 global canvas, A,k,CID 105 modifyCell(canvas,A,k,CID) 106 execCell(A,B,k) 107#実行メイン 108A,B=initdt() 109root=initTk() 110canvas=Canvas(root,width=290,height=290,highlightthickness=0) 111canvas.pack() 112CID=drawCell(canvas,A,0) 113k=0 114 115def animate(): 116 global k 117 modifyCell(canvas, A, k, CID) 118 execCell(A,B,k) 119 k = 1 + k 120 root.after(200, animate) 121 122root.after(200, animate) 123root.mainloop()

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

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

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

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

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

guest

回答3

0

ベストアンサー

初期条件の書き方はこれで正しいのでしょうか?それとも乱数がうまく機能していないのでしょうか?

条件式の書き方がおかしいです。
一つ例に取ると

python

1if (r_i > 0.10 or r_i <= 0.20):

これは「r_iが0.10より大きい もしくは r_iが0.20以下」であることを示します。
0.12などで試せば合っているように見えますが、
0の場合はどうでしょう?
r_i > 0.10はfalseになりますが、r_i <= 0.20はtrueになります。
orを使用しているので、どちらか片方がtrueであれば全体はtrueになります。

1の場合も同様ですね。


書いた数値計算のプログラムが、式が複雑なために式通りに正しく動いているか確かめたいのですが、書いたプログラムが大体合ってそうだと分かるソフトなどはあるのでしょうか?それとも、直接詳しい方に見てもらった方が良いのでしょうか?その場合、有料でも良いのでどんなサービスがあるか教えてもらえると嬉しいです。

そのプログラム内で確かめることはできなくもないですが、
よくある方法はその一部分だけを別ファイルに抜き出して試すとか、
その関数部分だけを実行してテストすることが多いです。

そもそもプログラムなんて入力と出力は無限にあるので、乱数を使ってものであればなおさら判定するソフトはないです。
見てもらうことも方法の一つではありますが、まずはご自身でテストを書いて確かめましょう。

投稿2018/12/05 05:35

dice142

総合スコア5158

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

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

suugaku_nyumon

2018/12/05 07:43

ご回答ありがとうございます。 やはり、一部分だけを別ファイルに抜き出したり、自分でテストを書いて確かめることが大切なのですね。ありがとうございます。
guest

0

if (r_i > 0.10 or r_i <= 0.20):
if (r_i > 0.20 or r_i <= 0.60):
andですね。

投稿2018/12/05 05:32

otn

総合スコア84712

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

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

suugaku_nyumon

2018/12/05 07:33

基本的なミスでした。ご回答ありがとうございます。
guest

0

とりあえず、

python3

1if(A[i1][i-1][15] == 1 or 2)

これA[i1][i-1][15]1または2だったらと書きたいんでしょうが
間違ってます。

投稿2018/12/05 05:27

ozwk

総合スコア13528

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

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

suugaku_nyumon

2018/12/05 07:31

ご回答ありがとうございます。 例えば、「A[i1][i-1][15]が1か2で、かつ、A[i1][i+1][15]が1か2の場合」を表す時は下のように書けばよいのでしょうか? if ((A[i1][i-1][15] == 1 or A[i1][i-1][15] == 2) and (A[i1][i+1][15] == 1 or A[i1][i+1][15] == 2)):
ozwk

2018/12/05 07:39

はい
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問