English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

如題,想要自行寫一個數字產生器,該怎麼寫勒!?
PS:只能用C語言寫,因為我只學過C語言~^^

2007-02-05 18:33:36 · 3 個解答 · 發問者 ? 2 in 電腦與網際網路 程式設計

Jacob Lee:
我想要的是每次執行每次都出現不同的,那該怎麼辦~@@?

2007-02-06 04:41:23 · update #1

3 個解答


#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

fedest.com, questions and answers