作者darkather (天王寺 蒼嵐)
看板C_and_CPP
標題[問題] C++中的亂數
時間Tue Nov 10 15:01:13 2009
小弟在作一個作業的時候
必須取得一個亂數
其範圍在-16.536~16.536之間
我原本使用的code(單單只有取亂數的部份)是
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
double random_number();
int main()
{
double a;
a = random_number();
cout << a << endl;
system("pause");
return 0;
}
double random_number()
{
srand((unsigned int)time(NULL));
double a = 16383.5;
double b = rand();
b -= a;
b /= a;
b *= 16.536;
return b;
}
結果發生的情況是
因為time(NULL)都靠時間取亂數
結果每次跑這個程式都得到沒有很大差別的亂數
因為必須在很短的時間內取到四個亂數
而且亂數的值必須要比較多變
所以也沒辦法先取%再轉換範圍
那樣值的選擇性會變的很少
有大大可以給點建議
怎麼樣可以確實的取到亂數嗎?
--
用妳給的承諾描繪愛情的輪廓
用妳美麗的笑容填入愛情的顏色
完成的那副情景,叫做幸福
而我是個畫家
我的工作就是完成這幅圖畫
並一輩子守護著它
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.124.71.6
※ 編輯: darkather 來自: 140.124.71.6 (11/10 15:04)
1F:推 cooper6334:怪怪的....srand是指你從那亂數表的那個位置開始取亂數 11/10 15:06
2F:→ cooper6334:跟你多快取一次亂數無關吧......有錯請鞭 11/10 15:07
3F:→ cooper6334:所以就只要最一開始做一次srand就可以了 11/10 15:08
4F:→ dendrobium:srand()不要放在這個func裡面 11/10 15:12
5F:推 cole945:你的seed,除了time,可以加入process/thread id的因素. 11/10 15:14
6F:→ cole945:例如 srand( time(NULL) ^ getpid() ); 之類的 11/10 15:14
7F:→ darkather:回應一樓,我有嘗試在一開始就做srand 11/10 15:20
8F:→ darkather:結果還是一樣,就是假如我第一次跑得到12457 11/10 15:20
9F:→ darkather:過沒多久再跑一次就是12460,然後12464...都這樣 11/10 15:21
10F:→ darkather:回應四樓,我可以把它放到MAIN去,可是結果沒有改變 11/10 15:22
11F:→ darkather:回應五樓,我如果想加上那個getpid,要加什麼標頭檔呢? 11/10 15:22
12F:→ dendrobium:google getpid 11/10 15:27
13F:→ MOONRAKER:以前有觀察到rand()在srand()之後幾次會有「不亂」的 11/10 15:40
14F:→ MOONRAKER:現象…你可以考慮取一百或兩百次亂數再使用最後四個 11/10 15:41
15F:→ MOONRAKER:當然srand()只能在主程式中執行 11/10 15:41
16F:→ TeaEEE:你的問題應該是每次執行程式 亂數表就會用srand重置 11/10 15:41