今天一樣是練習天,一樣也是兩個題目,但我覺得比昨天的好玩一點。
這是一個很有名的加密技術,就是把所有字母在字母表上往前或往後推移,這次就設定把所有字母往後推兩格。首先先設定好原本的密碼,還要有一個空白的字串,待會會把轉換好的字母一個一個放進去。
s = "abcdz"
secrect = 2
ans = ""
i = 0
如果要直接換字母電腦是做不到的,都要先把字母轉換成數字,位移好後再轉換回字母,像是第二行出現的ord()是用來把括號內的字母轉換成ASCII碼,如果是要把ASCII碼轉換成字母的話是用chr()。因為字母推移其實跟剪刀石頭布是很像的,它們都有一個循環的關係在,a會變成b、z又會變回a,所這邊一樣用取餘數的方式來計算,但因為a~z的ASCII碼是97~122,但取餘數都是從0開始,所以第五行的部分就是全部-97,讓a的數值變成0,b的數值變成1,最後再將它轉換回來就好了~
while i < len(s):
n = ord(s[i])
# ord("a") = 97
# chr(97) = "a"
n = n - ord("a")
new = (n + secrect) % 26 + ord("a")
ans = ans + chr(new)
i = i + 1
print(ans)
這邊介紹一個蠻有名的測量方法--蒙地卡羅法,是使用隨機數來解決很多計算問題的方法,其實用很白話的方式說就是用猜的,雖然可能不準確,但只要樣本數夠多就越接近真實答案。
今天要利用蒙地卡羅法來計算一個圓面積(先假裝你不知道A=πr^2),你可以想成有一個湖,先用一個正方形將它包起來,再隨機丟石頭在那個湖裡,最後根據你丟進湖的數量除上總共丟出的石頭,就可以得到比例,而外面的面積乘上比例就可以得到圓的面積。那因為樣本數越多就越準確,所以先設定總共執行10000次。
import random
total = 10000 # 總共執行次數
incircle = 0 # 丟進圓內的石頭
i = 0
之前有用過random模組裡的randint,它是產生隨機整數,但今天要做的是生成1~-1之間的隨機小數,所以使用裡面的uniform函式。那要如何判斷點有沒有在圓裡面呢?就是看x^2*y^2=r^2。
while i < total:
x = random.uniform(-1, 1) # 產生1~-1之間的隨機小數
y = random.uniform(-1, 1)
if x ** 2 + y ** 2 <= 1:
incircle = incircle + 1
else:
pass # 什麼都不做
i = i + 1
因為一開始設定圓的半徑是1,我用半徑2的正方形將它匡住,所以面積是4*ratio,當然你也可以用很大的矩形圍住湖,這個是沒有硬性規定的喔~
ratio = incircle / total
print("面積: ", 4 * ratio)