最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間: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()方法來產(chǎn)生一個隨機(jī)數(shù),這個產(chǎn)生的隨機(jī)數(shù)是0-1之間的一個double,我們可以把他乘以100,他就是個100以內(nèi)的隨機(jī)數(shù)字,這個在j2me中沒有。
  2. 在java.util這個包里面提供了一個Random的類,我們可以新建一個Random的對象來產(chǎn)生隨機(jī)數(shù),他可以生產(chǎn)隨機(jī)整數(shù)、隨機(jī)float、隨機(jī)double、隨機(jī)long,這個也是我們在j2me的程序里經(jīng)常用的一個取隨機(jī)數(shù)的方法。
  3. 在我們的System類中有一個currentTimeMillis()方法,這個方法返回一個從1970年1月1號0點0分0秒到目前的一個毫秒數(shù),返回類型是long,我們可以拿他作為一個隨機(jī)數(shù),我們可以拿他對一些數(shù)取模,就可以把他限制在一個范圍之內(nèi)啦。

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

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

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

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

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

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

下面看這樣一個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);

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

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

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

然后,

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

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

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

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

時鐘中斷服務(wù)程序中,每當(dāng)TIMER_LOW轉(zhuǎn)滿時,此時,記數(shù)器也會轉(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兩個16位二進(jìn)制數(shù)放進(jìn)temp數(shù)組,再送往RAND_SEED,從而獲得了“隨機(jī)種子”。
現(xiàn)在,可以確定的一點是,隨機(jī)種子來自系統(tǒng)時鐘,確切地說,是來自計算機(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語句來介紹main函數(shù)
  return 0;
}

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

總結(jié)

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

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

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

相關(guān)文章

  • SpringBoot隨機(jī)數(shù)設(shè)置及參數(shù)間引用的操作步驟

    SpringBoot隨機(jī)數(shù)設(shè)置及參數(shù)間引用的操作步驟

    在Spring Boot配置文件中設(shè)置屬性時,除了可以像前面示例中顯示的配置屬性值外,還可以使用隨機(jī)值和參數(shù)間引用對屬性值進(jìn)行設(shè)置。下面給大家介紹SpringBoot參數(shù)間引用隨機(jī)數(shù)設(shè)置的操作步驟,感興趣的朋友一起看看吧
    2021-06-06
  • Java文件與Base64之間的轉(zhuǎn)化方式

    Java文件與Base64之間的轉(zhuǎn)化方式

    這篇文章介紹了如何使用Java將文件(如圖片、視頻)轉(zhuǎn)換為Base64編碼,以及如何將Base64編碼轉(zhuǎn)換回文件,通過提供具體的工具類實現(xiàn),作者希望幫助讀者更好地理解和應(yīng)用這一過程
    2025-02-02
  • Java實現(xiàn)各種文件類型轉(zhuǎn)換方式(收藏)

    Java實現(xiàn)各種文件類型轉(zhuǎn)換方式(收藏)

    這篇文章主要介紹了Java?各種文件類型轉(zhuǎn)換的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Java多線程高并發(fā)中的Fork/Join框架機(jī)制詳解

    Java多線程高并發(fā)中的Fork/Join框架機(jī)制詳解

    本文主要介紹了 Java 多線程高并發(fā)中的 Fork/Join 框架的基本原理和其使用的工作竊取算法(work-stealing)、設(shè)計方式和部分實現(xiàn)源碼,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • 基于CopyOnWriteArrayList并發(fā)容器(實例講解)

    基于CopyOnWriteArrayList并發(fā)容器(實例講解)

    下面小編就為大家?guī)硪黄贑opyOnWriteArrayList并發(fā)容器(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • java打印表格 將ResultSet中的數(shù)據(jù)打印成表格問題

    java打印表格 將ResultSet中的數(shù)據(jù)打印成表格問題

    這篇文章主要介紹了java打印表格 將ResultSet中的數(shù)據(jù)打印成表格問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java中的布隆過濾器你真的懂了嗎

    Java中的布隆過濾器你真的懂了嗎

    經(jīng)常會聽到大家說起布隆過濾器,但是很多人都只是聽過名字,卻并不知道其是怎么實現(xiàn)的。下面將詳細(xì)介紹一下布隆過濾器,并且使用簡單的代碼演示
    2023-04-04
  • 如何使用ByteArrayOutputStream下載文件

    如何使用ByteArrayOutputStream下載文件

    這篇文章主要介紹了如何使用ByteArrayOutputStream下載文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java網(wǎng)絡(luò)編程UDP實現(xiàn)消息發(fā)送及聊天

    Java網(wǎng)絡(luò)編程UDP實現(xiàn)消息發(fā)送及聊天

    這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程UDP實現(xiàn)消息發(fā)送及聊天,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Open?Feign之非SpringCloud方式使用示例

    Open?Feign之非SpringCloud方式使用示例

    這篇文章主要為大家介紹了Open?Feign之非SpringCloud方式使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評論

寿阳县| 松阳县| 微山县| 舞阳县| 类乌齐县| 济南市| 荥经县| 日喀则市| 鹿泉市| 托里县| 镇江市| 扎兰屯市| 邓州市| 漯河市| 界首市| 三门峡市| 阳东县| 始兴县| 鄂伦春自治旗| 深水埗区| 城步| 紫阳县| 建始县| 双辽市| 扎囊县| 峡江县| 扬州市| 麻栗坡县| 旌德县| 湘阴县| 岳普湖县| 奉新县| 恩施市| 嘉义县| 南平市| 巩留县| 台前县| 筠连县| 富蕴县| 科技| 松桃|