如題,想要自行寫一個數字產生器,該怎麼寫勒!?
PS:只能用C語言寫,因為我只學過C語言~^^
2007-02-05 18:33:36 · 3 個解答 · 發問者 ? 2 in 電腦與網際網路 ➔ 程式設計
Jacob Lee:
我想要的是每次執行每次都出現不同的,那該怎麼辦~@@?
2007-02-06 04:41:23 · update #1
#include
#define A 97
#define B 23
#define RandMax 500
int r;
int _rand()
{
r = r * A + B;
r = r % RandMax;
return r;
}
int main()
{ int i;
r = 5; // set rand seed
for (i=0; i<99; i++)
printf("%5d\t", _rand());
system("PAUSE");
return 0;
}
2007-02-05 23:55:31 補充:
方法:
只要選出 2 個互質的大數(這個例子用的數太小!!),就可以了!
在實際應用上,不會寫成
r = r % RandMax;
會直接寫
return r % RandMax;
這樣,使用者沒辦法拿到整個 r 值,比較猜不到下一個 r 是多少。
r 通常不會設成 global variable。
這範例是因為方便讓你看懂:要設 rand seed
大致這樣,不懂再問。
^_^
2007-02-06 00:06:37 補充:
亂數產生器至少有2個要素:
1. 亂。(隨機性)
2. 均勻。(平均性)
上述〝return r % RandMax;〞是增加 1 的做法。
但,第一次的亂數要如何亂,方法很多,但多少都有漏洞。
最簡單的就是用時間來做第一次亂數的亂數種籽。
而 2. 則要靠你〝配合 RandMax 〞選的 A B 了!
那要些數學,也要點經驗。
最簡單的,就是選個 A, B, RandMax 兩兩互質的數。
這是你要的嗎?
2007-02-06 10:21:57 補充:
在最前面加上
#include
把 main 裡的
r = 5;
改成
r = time(NULL);
2007-02-06 13:36:41 補充:
上述是根據您的題目:〝自行寫一個數字產生器〞,所以那麼寫。
如果您是要用內建函數,如下:
#include
int main( )
{ int i;
srand(time(NULL));
for (i=0; i<99; i )
printf("", rand( ) );
}
以上都是整數亂數。
您若真的需要小數亂數,我再奉告。
2007-02-06 13:38:27 補充:
偉大的知識+又耍寶了。
重述如下:
上述是根據您的題目:〝自行寫一個數字產生器〞,所以那麼寫。
如果您是要用內建函數,如下:
#include
int main( )
{ int i;
srand(time(NULL));
for (i=0; i<99; i )
printf("", rand( ) );
}
2007-02-06 13:39:06 補充:
偉大的知識+又耍寶了。
看來它不想讓我好好的寫。
重述如下:
2007-02-06 13:39:49 補充:
上述是根據您的題目:〝自行寫一個數字產生器〞,所以那麼寫。
如果您是要用內建函數,如下:
#include
int main( )
{ int i;
srand(time(NULL));
for (i=0; i<99; i )
printf("", rand( ) );
}
2007-02-06 13:40:25 補充:
以上都是整數亂數。您若真的需要小數亂數,我再奉告。
2007-02-06 13:41:25 補充:
++ 又被吃了!!
for 那列最後的 i 是 i++,++是半型!
2007-02-06 22:22:08 補充:
琳琳補充的最後那列
return (int)(randseed >> 16) & RAND_MAX;
中,>> 16 的作用叫使用 High Bits,
在均勻性中,那是很重要的觀念!!
2007-02-09 02:25:04 補充:
包括大家常用的
num = rand() % something
其實是不太建議的。
好處:快,好寫。
缺點:較不均勻!因為使用的是 low bits
2007-09-12 02:45:41 補充:
我已在我的論壇發表一篇較完整的 rand( )
歡迎有興趣的網友前往觀看,
並提供意見與指正。^_^
http://www.phpbbserver.com/graphicsparalle/viewtopic.php?p=201
2007-02-05 18:52:21 · answer #1 · answered by ? 7 · 1⤊ 0⤋
補充一下好了..其實 C standard library 的 rand() 和 srand() 很簡單就像底下的樣子
#define RAND_MAX 32767
unsigned int _randseed = 1;
void srand(unsigned int seed)
{
_randseed = seed;
}
int rand(void)
{
_randseed = _randseed * 1103515245 + 12345;
return ((unsigned int) (_randseed >> 16) & RAND_MAX):
}
========================================================
Microsoft 的 Visual C/C++ 的 rand() 是
#define RAND_MAX 32767
srand() 和標準的一樣
int rand(void)
{
randseed = randseed * 214013 + 2531011;
return (int)(randseed >> 16) & RAND_MAX;
}
2007-02-06 20:29:19 補充:
http://www.plauger.com/
2007-02-06 15:22:55 · answer #2 · answered by 鳳琳 5 · 0⤊ 0⤋
http://www.cppreference.com/stdother/srand.html
首先,你要先設定 seed,用上面這個連結的函式能設定。
http://www.cppreference.com/stddate/time.html
一般而言,大家都是把當時的時間當seed,當然也有些人不一樣。
http://www.cppreference.com/stdother/rand.html
最後就可以快樂的使用rand函式取得不太亂的亂數了。
2007-02-06 11:29:48 補充:
如果你想要的是自己的亂數函式,可以參考一些關於如何產生均勻亂數的演算法。
2007-02-06 06:26:17 · answer #3 · answered by 名字 1 · 0⤊ 0⤋