[英]how to use dialog flow API using Python and make your customised chat-bot?
[英]how to make your customised rand function in python
我想做一個隨機數發生器
所以我做了很多研究,並在下面做了一小段代碼
a=1
b=2
m=5000
x=3
lst=[]
for i in range(10):
x=(a*x+b)%m
lst.append(x)
print(lst)
if len(lst) != len(set(lst)):
print("it has duplicates but possibly random numbers")
else:
print("those were random numbers")
我從這里得到的數學方程式為我提供了一些隨機數,但是只有當值較大時,如果我選擇了較小的值(假設m = 5,其余的值保持不變),我可以看到形成了重復的數字序列。
* 題*
我可以從這里看到python是從OS中獲取的,它不會生成它們,所以這是在python中生成隨機數的正確方法嗎?
我只介紹非 加密安全的偽隨機數生成器
PRNG是一種返回明顯隨機(偽隨機)數的函數,足以欺騙人類。 有一個模式 ,這只是一個硬模式(對我們而言)
例如:
以下序列非常簡單(我想說,如果它是由PRNG生成的,那是一個非常糟糕的PRNG)
[0,2,4,6,8]
現在,我想說其他序列是由更好的PRNG生成的
[1、5、5、2、6、0、3]
因此,我們需要一個函數,該函數生成具有(人類)硬模式的序列,並且每個數字都取決於先前的數字。
一個好的方法可能是使用一堆邏輯和算術運算(例如XOR,Division,OR,減法,模數)
我完全按照上面的描述編寫了此函數,對我來說,結果非常令人滿意。
n = 0xDEADBEEF
#returns a pseudorandom number between 0-9
def random():
global n
n = (n * 63) % 0xC4CB7296
n = n ^ 0x1754FBF
n = (n*0xFF) % 4294967296
n = n ^ 0x222F42CB
n = n | 0x1234567890
n = ((n + 14351514) * 32) % 7777333
return n % 10
for i in range(6):
print(random())
#Outputs:
2
4
7
2
6
9
如果您不總是想要相同的結果,則可以使用種子:
def seed(s):
global n
n = s
seed(12345)
for i in range(6):
print(random())
#Outputs
9
1
5
8
5
9
您的隨機性是最正確的。 問題出在您的范圍生成器上:
一般混合同余生成器的周期最多為m,對於某些因子選擇,其周期遠小於m。
因此,如果您的m=5
范圍不應超過5。
另外,請注意:
混合同余生成器將在以下情況下為所有種子值提供完整周期:
m
和偏移量c
是相對質數,
a-1
可被m
所有素因子整除,
如果m
被4整除,則a-1
被4整除。
資料來源:您提供的Wiki文章
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.