亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中隨機(jī)數(shù)的產(chǎn)生方式與原理詳解

 更新時(shí)間:2016年11月12日 10:19:48   投稿:lqh  
這篇文章主要介紹了Java中隨機(jī)數(shù)的產(chǎn)生方式與原理詳解的相關(guān)資料,需要的朋友可以參考下

Java中隨機(jī)數(shù)的產(chǎn)生方式與原理

查閱隨機(jī)數(shù)相關(guān)資料,特做整理

首先說一下java中產(chǎn)生隨機(jī)數(shù)的幾種方式

  1. 在j2se中我們可以使用Math.random()方法來(lái)產(chǎn)生一個(gè)隨機(jī)數(shù),這個(gè)產(chǎn)生的隨機(jī)數(shù)是0-1之間的一個(gè)double,我們可以把他乘以100,他就是個(gè)100以內(nèi)的隨機(jī)數(shù)字,這個(gè)在j2me中沒有。
  2. 在java.util這個(gè)包里面提供了一個(gè)Random的類,我們可以新建一個(gè)Random的對(duì)象來(lái)產(chǎn)生隨機(jī)數(shù),他可以生產(chǎn)隨機(jī)整數(shù)、隨機(jī)float、隨機(jī)double、隨機(jī)long,這個(gè)也是我們?cè)趈2me的程序里經(jīng)常用的一個(gè)取隨機(jī)數(shù)的方法。
  3. 在我們的System類中有一個(gè)currentTimeMillis()方法,這個(gè)方法返回一個(gè)從1970年1月1號(hào)0點(diǎn)0分0秒到目前的一個(gè)毫秒數(shù),返回類型是long,我們可以拿他作為一個(gè)隨機(jī)數(shù),我們可以拿他對(duì)一些數(shù)取模,就可以把他限制在一個(gè)范圍之內(nèi)啦。

EN。。。其實(shí)在Random的默認(rèn)構(gòu)造方法里也是使用上面第三種方法進(jìn)行隨機(jī)數(shù)的產(chǎn)生的。

對(duì)于方法二中的Random類有兩種構(gòu)建方式:帶種子和不帶種子

不帶種子:此種方式將會(huì)返回隨機(jī)的數(shù)字,每次運(yùn)行結(jié)果不一樣,相當(dāng)于用System.currentTimeMillis()作種子。

帶種子:此種方式,無(wú)論程序運(yùn)行多少次,返回結(jié)果都是一樣的。如果用相同的種子創(chuàng)建兩個(gè)Random實(shí)例,則對(duì)每個(gè)實(shí)例進(jìn)行相同的方法調(diào)用序列,它們將生成并返回相同的數(shù)字序列。

偽隨機(jī)數(shù)

計(jì)算機(jī)中的隨機(jī)數(shù)都是偽隨機(jī)數(shù)

下面看這樣一個(gè)C程序:

// rand_1.cpp
#include <stdlib.h>
static unsigned int RAND_SEED;
unsigned int random(void)
{
  RAND_SEED = (RAND_SEED*123+59)%65536;
  return (RAND_SEED);
}
void random_start(void)
{
  int temp[2];
  movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);
  RAND_SEED = temp[0];
}
void main()
{
  unsigned int i,n;
  random_start();
  for(i=0;i<10;i++)
     printf("#u\t",random());
  printf("\n");
}

它完整地闡述了隨機(jī)數(shù)產(chǎn)生的過程:

首先,

movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);

這個(gè)函數(shù)用來(lái)移動(dòng)內(nèi)存數(shù)據(jù),其中FP_SEG(far pointer to segment)是取temp數(shù)組段地址的函數(shù),F(xiàn)P_OFF(far pointer to offset)是取temp數(shù)組相對(duì)地址的函數(shù),movedata函數(shù)的作用是把位于0040:006CH存儲(chǔ)單元中的雙字放到數(shù)組temp的聲明的兩個(gè)存儲(chǔ)單元中。這樣可以通過temp數(shù)組把0040:006CH處的一個(gè)16位的數(shù)送給RAND_SEED。
其次,

RAND_SEED=(RAND_SEED*123+59)%65536;

是用來(lái)計(jì)算隨機(jī)數(shù)的方法,隨機(jī)數(shù)的計(jì)算方法在不同的計(jì)算機(jī)中是不同的,即使在相同的計(jì)算機(jī)中安裝的不同的操作系統(tǒng)中也是不同的。我在linux和windows下分別試過,相同的隨機(jī)種子在這兩種操作系統(tǒng)中生成的隨機(jī)數(shù)是不同的,這說明它們的計(jì)算方法不同。

然后,

movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);

隨機(jī)種子為什么要在內(nèi)存的0040:006CH處???0040:006CH處存放的是什么?

學(xué)過《計(jì)算機(jī)組成原理與接口技術(shù)》這門課的人可能會(huì)記得在編制ROM BIOS時(shí)鐘中斷服務(wù)程序時(shí)會(huì)用到Intel 8253定時(shí)/計(jì)數(shù)器,它與Intel 8259中斷芯片的通信使得中斷服務(wù)程序得以運(yùn)轉(zhuǎn),主板每秒產(chǎn)生的18.2次中斷正是處理器根據(jù)定時(shí)/記數(shù)器值控制中斷芯片產(chǎn)生的。在我們計(jì)算機(jī)的主機(jī)板上都會(huì)有這樣一個(gè)定時(shí)/記數(shù)器用來(lái)計(jì)算當(dāng)前系統(tǒng)時(shí)間,每過一個(gè)時(shí)鐘信號(hào)周期都會(huì)使記數(shù)器加一,而這個(gè)記數(shù)器的值存放在哪兒呢?沒錯(cuò),就在內(nèi)存的0040:006CH處,其實(shí)這一段內(nèi)存空間是這樣定義的:

TIMER_LOW DW ? ;地址為 0040:006CH
TIMER_HIGH DW ? ;地址為 0040:006EH
TIMER_OFT DB ? ;地址為 0040:0070H

時(shí)鐘中斷服務(wù)程序中,每當(dāng)TIMER_LOW轉(zhuǎn)滿時(shí),此時(shí),記數(shù)器也會(huì)轉(zhuǎn)滿,記數(shù)器的值歸零,即TIMER_LOW處的16位二進(jìn)制歸零,而TIMER_HIGH加一。rand01.c中的

movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4);

正是把TIMER_LOW和TIMER_HIGH兩個(gè)16位二進(jìn)制數(shù)放進(jìn)temp數(shù)組,再送往RAND_SEED,從而獲得了“隨機(jī)種子”。
現(xiàn)在,可以確定的一點(diǎn)是,隨機(jī)種子來(lái)自系統(tǒng)時(shí)鐘,確切地說,是來(lái)自計(jì)算機(jī)主板上的定時(shí)/計(jì)數(shù)器在內(nèi)存中的記數(shù)值。

EN...沒有最后。。lvl--

再看一段代碼:

//rand_2.cpp
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
  srand((unsigned)time(NULL));
  unsigned int r=rand();
  cout<<"r = "<<r<<endl; //根據(jù)C++ 98標(biāo)準(zhǔn),可以不用return語(yǔ)句來(lái)介紹main函數(shù)
  return 0;
}

這里用戶和其他程序沒有設(shè)定隨機(jī)種子,則使用系統(tǒng)定時(shí)/計(jì)數(shù)器的值做為隨機(jī)種子,所以,在相同的平臺(tái)環(huán)境下,編譯生成exe后,每次運(yùn)行它,顯示的隨機(jī)數(shù)會(huì)是偽隨機(jī)數(shù),即每次運(yùn)行顯示的結(jié)果會(huì)有不同。

總結(jié)

隨機(jī)數(shù)是由隨機(jī)種子根據(jù)一定的計(jì)算方法計(jì)算出來(lái)的數(shù)值。所以,只要計(jì)算方法一定,隨機(jī)種子一定,那么產(chǎn)生的隨機(jī)數(shù)就不會(huì)變。在相同的平臺(tái)環(huán)境下,編譯生成exe后,每次運(yùn)行它,顯示的隨機(jī)數(shù)都是一樣的。這是因?yàn)樵谙嗤木幾g平臺(tái)環(huán)境下,由隨機(jī)種子生成隨機(jī)數(shù)的計(jì)算方法都是一樣的,再加上隨機(jī)種子一樣,所以產(chǎn)生的隨機(jī)數(shù)就是一樣的。

只要用戶或第三方不設(shè)置隨機(jī)種子,那么在默認(rèn)情況下隨機(jī)種子來(lái)自系統(tǒng)時(shí)鐘(即定時(shí)/計(jì)數(shù)器的值)

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • 解讀Java和JavaScript區(qū)別與聯(lián)系

    解讀Java和JavaScript區(qū)別與聯(lián)系

    這篇文章主要介紹了解讀Java和JavaScript區(qū)別與聯(lián)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java整數(shù)和字符串相互轉(zhuǎn)化實(shí)例詳解

    Java整數(shù)和字符串相互轉(zhuǎn)化實(shí)例詳解

    這篇文章主要介紹了Java整數(shù)和字符串相互轉(zhuǎn)化實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java中的5種同步輔助類介紹

    Java中的5種同步輔助類介紹

    你提交了一些任務(wù),但你想等它們都完成了再做另外一些事情;你提交了一些任務(wù),但是不想讓它們立刻執(zhí)行,等你喊123開始的時(shí)候,它們才開始執(zhí)行;等等這些場(chǎng)景,線程之間需要相互配合,或者等待某一個(gè)條件成熟執(zhí)行。這些場(chǎng)景想你就需要用到同步輔助類
    2014-04-04
  • Java程序執(zhí)行過程及內(nèi)存機(jī)制詳解

    Java程序執(zhí)行過程及內(nèi)存機(jī)制詳解

    本講將介紹Java代碼是如何一步步運(yùn)行起來(lái)的,還會(huì)介紹Java程序所占用的內(nèi)存是被如何管理的:堆、棧和方法區(qū)都各自負(fù)責(zé)存儲(chǔ)哪些內(nèi)容,感興趣的朋友跟隨小編一起看看吧
    2020-12-12
  • Java實(shí)現(xiàn)List去重的幾種方法總結(jié)

    Java實(shí)現(xiàn)List去重的幾種方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Java中List去重的幾種常用方法總結(jié),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和參考價(jià)值,需要的小伙伴可以了解一下
    2023-09-09
  • SpringSecurity自定義資源攔截規(guī)則及登錄界面跳轉(zhuǎn)問題

    SpringSecurity自定義資源攔截規(guī)則及登錄界面跳轉(zhuǎn)問題

    這篇文章主要介紹了SpringSecurity自定義資源攔截規(guī)則及登錄界面跳轉(zhuǎn)問題,我們想要自定義認(rèn)證邏輯,就需要?jiǎng)?chuàng)建一些原來(lái)不存在的bean,這個(gè)時(shí)候就可以使@ConditionalOnMissingBean注解,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-12-12
  • Java快速入門掌握類與對(duì)象及變量的使用

    Java快速入門掌握類與對(duì)象及變量的使用

    類和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱。對(duì)象是對(duì)客觀事物的抽象,類是對(duì)對(duì)象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域
    2022-04-04
  • Java Retrofit源碼層深入分析

    Java Retrofit源碼層深入分析

    這篇文章主要介紹了Java Retrofit源碼層分析,Retrofit是一個(gè)RESTful的HTTP網(wǎng)絡(luò)請(qǐng)求框架的封裝,網(wǎng)絡(luò)請(qǐng)求的工作本質(zhì)上是OkHttp完成,而Retrofit僅負(fù)責(zé)網(wǎng)絡(luò)請(qǐng)求接口的封裝
    2023-01-01
  • mybatis sum(參數(shù)) 列名作為參數(shù)的問題

    mybatis sum(參數(shù)) 列名作為參數(shù)的問題

    這篇文章主要介紹了mybatis sum(參數(shù)) 列名作為參數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java實(shí)戰(zhàn)房屋租賃網(wǎng)的實(shí)現(xiàn)流程

    Java實(shí)戰(zhàn)房屋租賃網(wǎng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)房屋租賃網(wǎng)站,大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11

最新評(píng)論