史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   請問C++裡的亂數函式庫 (http://forum.slime.com.tw/thread222096.html)

a19870504 2007-12-14 07:02 PM

請問C++裡的亂數函式庫
 
小弟現有的兩本書 對這方面敘述的實在是不夠清楚 一直看不懂所以上來發問一下

為什麼預設的情況下 rand() 是32767

那我要限制他輸出的範圍的話 是使用 rand()%N+1 就會是限定範圍在1~N之間

然後小弟用手算了一下 感覺不太對阿 ="=

還有要產生出0~1之間的浮點亂數 為什麼是 rand()/RAND_MAX

mini 2007-12-14 08:20 PM

對 C/C++ 而言

srand 是類似 "洗牌" 的動作 (攪亂後重排 放入 亂數表列中)
srand 函式 有個 引數 "參考值"
簡單講就是告訴 "如何攪亂"

當程式第一次執行 rand 時
得到的值是
亂數表列 的第一個值
之後以此類推
(當程式第二次執行 rand 時,得到的值是 亂數表列 的第二個值...)

如果程式未設計 "一開始用 srand 洗牌"
就相當於
一副新的未拆封的撲克牌
所以其順序是一定的(照理說 全世界新的撲克牌 其開封時 疊放順序都是一樣的)

也就是
每次啟動程式執行時
亂數表都是一樣的

亂數表一樣
執行到 rand
得到的值都會是固定變化的 (可預期)

如果 srand 加上固定的 引數 的話
是否也是會得到 可預期 的值呢?
答案當然是 "Yes"

mini 2007-12-14 08:56 PM

引用:

作者: a19870504 (文章 1860047)
我要限制他輸出的範圍的話 是使用 rand()%N+1 就會是限定範圍在1~N之間
然後小弟用手算了一下 感覺不太對阿 ="=

依據一般說明 rand() 會產生0~32767之間的亂數

打開 stdlib.h 可以找到其原形
int rand(void)

C/C++ 的 int 整數使用 4個byte紀錄
範圍是
int 2147483647 ~ -2147483648

所以證明
不一定最大值是 32767 (不同版本甚至編譯器 都可能有不同結果)


回到你說 感覺不太對阿
應該是沒有問題的啊
100 取 N 的餘數
範圍是在 0 ~ N-1
所以+1 的話
範圍就變成 1 ~ N

一個得到字元的範圍之應用
(char)(rand()%26 +65); //轉成英文字母 (A~Z)
(char)(rand()%10 +48); //轉成阿拉伯數字 (0~9)

a19870504 2007-12-15 01:57 PM

MINI大真是強

其實小弟還有些問題想要請教 請問MINI大有使用MSN或是即時通之類的軟體嗎

想說可以討論多一點

小弟的MSN跟即時通 a19870504@yahoo.com.tw

mini 2007-12-15 04:50 PM

引用:

作者: a19870504 (文章 1860286)
有使用MSN或是即時通之類的軟體嗎
想說可以討論多一點

不好意思
沒有在用這類軟體

個人不常用 C/C++
以上只是經驗常識而已

joebin 2007-12-21 12:39 AM

mini你沒講到他要問的問題,我幫你補充好了

要產生出0~1之間的浮點亂數 為什麼是 rand()/RAND_MAX??


首先要知道的是當n=rand()時,n的範圍為rand能涵蓋的範圍,也就是0~RAND_MAX

為何要產生0~1之間的浮點數要rand()/RAND_MAX的原因是,當RAND_MAX為分母時,其分子rand()最多也只能是RAND_MAX,最少是0


to in short :

0 <= rand() <= RAND_MAX , in the result of "RAND_MAX > 0"

so 0/RAND_MAX <= rand()/RAND_MAX <= RAND_MAX/RAND_MAX

then 0 <= rand()/RAND_MAX <= 1


所有時間均為台北時間。現在的時間是 03:34 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1