- N +

隨機(jī)數(shù)表的讀取方法(隨機(jī)數(shù)產(chǎn)生)

51單片機(jī)用C語言產(chǎn)生一個(gè)100以內(nèi)的隨機(jī)數(shù),怎么生成

C語言本身并不能產(chǎn)生隨機(jī)數(shù)。介紹一個(gè)比較簡單的隨機(jī)數(shù)獲取方法:啟動(dòng)單片機(jī)的定時(shí)器,讓它自己跑不要發(fā)生溢出中斷,用戶操作時(shí)直接讀計(jì)數(shù)器數(shù)值,那基本上就是個(gè)隨機(jī)數(shù)。

隨機(jī)數(shù)表的讀數(shù)規(guī)則

1、統(tǒng)一編號(hào)。

即將總體中的所有研究對(duì)象進(jìn)行統(tǒng)一編號(hào),做成簽。如果研究對(duì)象是10以內(nèi)的,只取1位數(shù),則編號(hào)是1~9;如果研究對(duì)象在1~99之間的,取2位數(shù),則編號(hào)是01~99。

2、確定行名。

研究人員根據(jù)自己的需要或意愿,在表上任選一行數(shù)字,由該行數(shù)字決定起點(diǎn)行的數(shù)。如選擇25行,即從上往下第25行為起點(diǎn)行。若選擇的數(shù)大于50,則用該數(shù)減去50,將所得余數(shù)為起點(diǎn)行。若選擇0或00行,則以第50行為起點(diǎn)行。

haskell中如何抽取隨機(jī)數(shù)

隨機(jī)數(shù)(我指的是偽隨機(jī)數(shù))是通過顯式或隱式的狀態(tài)來生成的。這意味著在Haskell中,隨機(jī)數(shù)的使用(通過System.Random庫)是伴隨著狀態(tài)的傳遞的。

大部分需要獲得幫助的人都有命令式編程的背景,因此,我會(huì)先用命令式的方式,然后再用函數(shù)式的方式來教大家在Haskell中使用隨機(jī)數(shù)。

任務(wù)

我會(huì)生成滿足以下條件的隨機(jī)列表:

列表長度是1到7

列表中的每一項(xiàng)都是0.0到1.0之間的浮點(diǎn)數(shù)

命令式

在IOmonad中有一個(gè)全局的生成器,你可以初始化它,然后獲取隨機(jī)數(shù)。下面有一些常用的函數(shù):

setStdGen::StdGen->IO()

初始化或者設(shè)置全局生成器,我們可以用mkStdGen來生成隨機(jī)種子。因此,有一個(gè)很傻瓜式的用法:

setStdGen(mkStdGen42)

當(dāng)然,你可以用任意的Int來替換42。

其實(shí),你可以選擇是否調(diào)用setStdGen,如果你不調(diào)用的話,全局的生成器還是可用的。因?yàn)樵趓untime會(huì)在啟動(dòng)的時(shí)候用一個(gè)任意的種子去初始化它,所以每次啟動(dòng)的時(shí)候,都會(huì)有一個(gè)不同的種子。

randomRIO::(Randoma)=>(a,a)->IOa

在給定范圍隨機(jī)返回一個(gè)類型為a的值,同時(shí)全局生成器也會(huì)更新。你可以通過一個(gè)元組來指定范圍。下面這個(gè)例子會(huì)返回a到z之間的隨機(jī)值(包含a和z):

c<-randomRIO('a','z')

a可以是任意類型嗎?并非如此。在Haskell98標(biāo)準(zhǔn)中,Random庫只支持Bool,Char,Int,Integer,Float,Double(你可以自己去擴(kuò)展這個(gè)支持的范圍,但這是另外一個(gè)話題了)。

randomIO::(Randoma)=>IOa

返回一個(gè)類型為a的隨機(jī)數(shù)(a可以是任意類型嗎?看上文),全局的生成器也會(huì)更新。下面這個(gè)例子會(huì)返回一個(gè)Double類型的隨機(jī)數(shù):

x<-randomIO::IODouble

隨機(jī)數(shù)返回的范圍由類型決定。

需要注意的是,這些都是IO函數(shù),因此你只可以在IO函數(shù)中使用它們。換句話說,如果你寫了一個(gè)要使用它們的函數(shù),它的返回類型也會(huì)變成是IO函數(shù)。

舉個(gè)例子,上面提到的代碼片段都要寫在doblock中。這只是一個(gè)提醒,因?yàn)槲覀兿胍妹钍降姆绞絹砩呻S機(jī)數(shù)。

下面這個(gè)例子展示如何在IOmonad中完成之前的任務(wù):

importSystem.Randommain=dosetStdGen(mkStdGen42)--這步是可選的,如果有這一步,你每一次運(yùn)行的結(jié)果都是一樣的,因?yàn)殡S機(jī)種子固定是42s<-randomStuffprintsrandomStuff::IO[Float]randomStuff=don<-randomRIO(1,7)sequence(replicaten(randomRIO(0,1)))

純函數(shù)式

你可能有以下原因想知道如何用函數(shù)式的方式生成隨機(jī)數(shù):

你有好奇心

你不想用IOmonad

因?yàn)橐恍┎l(fā)或者其他原因,你想幾個(gè)生成器同時(shí)存在,共享全局生成器不能解決你的問題

實(shí)際上,有兩種方法來用函數(shù)式的方式去生成隨機(jī)數(shù):

從stream(無限列表)中提取隨機(jī)數(shù)

把生成器當(dāng)成函數(shù)參數(shù)的一部分,然后返回隨機(jī)數(shù)

這里有一些常用的函數(shù)用來創(chuàng)建生成器和包含隨機(jī)數(shù)的無限列表。

mkStdGen::Int->StdGen

用隨機(jī)種子創(chuàng)建生成器。

randomRs::(Randoma,RandomGeng)=>(a,a)->g->[a]

用生成器生成給定范圍的無限列表。例子:用42作為隨機(jī)種子,返回a到z之間包含a和z的無限列表:

randomRs('a','z')(mkStdGen42)

類型a是隨機(jī)數(shù)的類型。類型g看起來是通用的,但實(shí)際上它總是StdGen。

randoms::(Randoma,RandomGeng)=>g->[a]

用給定的生成器生成隨機(jī)數(shù)的無限列表。例如:用42作為隨機(jī)種子生成Double類型的列表:

randoms(mkStdGen42)::[Double]

隨機(jī)數(shù)的范圍由類型決定,你需要查文檔來確定具體范圍,或者直接用randomRs。

注意,這些都是函數(shù)式的——意味著這里面沒有副作用,特別是生成器并不會(huì)更新。如果你用一個(gè)生成器去生成第一個(gè)列表,然后用相同的生成器去生成第二個(gè)列表…

g=mkStdGen42a=randomsg::[Double]b=randomsg::[Double]

猜猜結(jié)果,由于透明引用,這兩個(gè)列表的結(jié)果是一樣的!(如果你想用一個(gè)隨機(jī)種子來生成兩個(gè)不同的列表,我等下告訴你一個(gè)方法)。

下面一種方法來完成創(chuàng)建1到7的隨機(jī)列表:

importSystem.Randommain=doletg=mkStdGen42let[s]=take1(randomStuffg)printsrandomStuff::RandomGeng=>g->[[Float]]randomStuffg=work(randomRs(0.0,1.0)g)work::[Float]->[[Float]]work(r:rs)=letn=truncate(r*7.0)+1(xs,ys)=splitAtnrsinxs:workys

除了必要的打印操作外,這是純函數(shù)式的。它用生成器生成了無限列表,然后再用這個(gè)無限列表來生成另一個(gè)無限列表作為答案,最后取第一個(gè)作為返回值。

我這樣做是因?yàn)楸M管我們今天的人物是生成一個(gè)隨機(jī)數(shù),但你通常會(huì)需要很多個(gè),我希望這個(gè)例子可以對(duì)你有點(diǎn)幫助。

上面的代碼的工作原理是:用一個(gè)生成器,創(chuàng)建一個(gè)包含F(xiàn)loat的無限列表。截取第一個(gè)值,并擴(kuò)大這個(gè)值到1到7,然后用剩下的列表來生成答案。換句話說,把輸入的列表分成(r:rs),r決定生成列表的長度(1到7),rs之后會(huì)被計(jì)算答案。

split::(RandomGeng)=>g->(g,g)

用一個(gè)隨機(jī)種子創(chuàng)建兩個(gè)不同的生成器,其他情況下重用相同的種子是不明智的。

g=mkStdGen42(ga,gb)=splitg--donotusegelsewhere

如果你想創(chuàng)建多余兩個(gè)的生成器,你可以對(duì)新的生成器中的其中一個(gè)使用split:

g=mkStdGen42(ga,g')=splitg(gb,gc)=splitg'--donotuseg,g'elsewhere

我們可以用split來獲得兩個(gè)生成器,這樣我們就可以產(chǎn)生兩個(gè)隨機(jī)列表了。

c<-randomRIO('a','z')0

它把生成器分成兩個(gè),然后產(chǎn)生兩個(gè)列表。

我在主程序中硬編碼了隨機(jī)種子。正常情況下你可以在其他地方獲取隨機(jī)種子——從輸入中獲取,從文件中獲取,從時(shí)間上獲取,或者從某些設(shè)備中獲取。

這些在主程序中都是do-able的,因?yàn)樗鼈兌伎梢栽贗Omonad中訪問。

你也可以通過getStdGen獲取全局生成器:

c<-randomRIO('a','z')1

scl如何讀取隨機(jī)數(shù)

SCL可以使用Math函數(shù)庫中的rand函數(shù)來讀取隨機(jī)數(shù),該函數(shù)可以生成一個(gè)0到1之間的隨機(jī)數(shù)。此外,還可以使用srand函數(shù)來指定生成隨機(jī)數(shù)的種子,這樣可以控制隨機(jī)數(shù)的生成,使得每次生成的隨機(jī)數(shù)序列都是不同的。如果需要生成指定范圍內(nèi)的隨機(jī)數(shù),可以使用簡單的數(shù)學(xué)運(yùn)算來實(shí)現(xiàn),例如生成0到100之間的隨機(jī)整數(shù),則可以先使用rand函數(shù)生成0到1之間的隨機(jī)數(shù),然后乘以100再向下取整即可。

ABAP中怎樣獲取隨機(jī)數(shù)

可以使用函數(shù):RANDOM_AMOUNT該函數(shù)可指定rnd_min和rnd_max來確定隨機(jī)數(shù)的取數(shù)范圍如:CALLFUNCTION'RANDOM_AMOUNT'EXPORTINGrnd_min='1'"最小取值rnd_max='99'"最大取值IMPORTINGrnd_amount=lv_num"將獲取的隨機(jī)數(shù)存入變量lv_num中

高一數(shù)學(xué)隨機(jī)數(shù)的讀表規(guī)則

一,統(tǒng)一編號(hào),即將總體中的所有研究對(duì)象進(jìn)行統(tǒng)一編號(hào),然后充分混合,目的是使各樣本編號(hào)均勻分布,符合機(jī)會(huì)均等的原則

二,確定抽樣起點(diǎn),根據(jù)需要或意愿,在表上選擇一數(shù)字編號(hào),由該數(shù)字決定抽樣起點(diǎn)

三,確定抽樣順序,根據(jù)需要或意愿選擇一定順序方向使用該種順序方向進(jìn)行抽取

四,錄取號(hào)碼,根據(jù)抽樣起點(diǎn)和抽樣順序進(jìn)行依次錄取號(hào)碼,直至錄取到所需抽取的樣本數(shù)滿為止

返回列表
上一篇:
下一篇: