綠茶妹
發表於 12-4-11 22:43
sjgau 發表於 12-4-11 21:18 static/image/common/back.gif
我的建議是
搞一個 counter, 紀錄啟動以後的 一些使用者有關的動作的
時間間隔
嗯..這也是一個解法。
有一種解法,
是用一個counter,並且將這個數值偷存在flash之類不會因為關電而消失的儲存元件裡。
這個一直累加的東西就可以當種子。
(不能因為關電而消失..否則每次一開電,行為就一模一樣)
sjgau
發表於 12-4-11 22:54
綠茶妹 發表於 12-4-11 22:43 static/image/common/back.gif
嗯..這也是一個解法。
有一種解法,
存放 flash 是正解,
然後,找一些跟使用者操作有關的訊息
隨時去改變 亂數的種子數
abdiel
發表於 12-4-11 23:42
其實,玩程式 跟 玩交易有很大、很大的差別…
很多程式交易穩定賺很多coco的交易員,程式寫的真的不怎麼樣的……
sjgau
發表於 12-4-12 05:58
產生 兩億個亂數,
我的方法, VS 使用系統改進的 big_rand()
10.717秒 VS 8.611秒
// for fast random number generator
#include "inc-01.h"
// ----------------------------------------------
int main(int argc, char *argv[])
{
// for rnd1(), rnd2(), irnd(), ...
int t1, t2, s1, s2, no, min, max, i;
double ct= 0.0, dt;
no= (int) (2E8 + 0.5);
time1(&s1);
time1(&t1);
for (i=0;i<no;i++) {
rnd1(&s1);
// s1= big_rand();
rnd1(&s1);
}
time2(t1, &dt);
printf("\n dt= %.3lf \n", dt);
pause();
return EXIT_SUCCESS;
}// end of main()
sjgau
發表於 12-4-12 06:41
模擬丟骰子 兩億次,
花費時間 17.901秒
// for fast random number generator
#include "inc-01.h"
// ----------------------------------------------
// rnd2(&s1, &x);
void rnd2(int *s1, double *x)
{
rnd1(s1);
(*x)= ((double) *s1)/2147483647.0;
}// end of rnd2()
// ----------------------------------------------
// swap_int( &i1, &i2);
void swap_int(int *a, int *b)
{
int temp;
temp= *a;
*a= *b;
*b= temp;
}// end of swap_int()
// ----------------------------------------------
// irnd(&s1, i1, i2, &ii);
void irnd(int *s1, int i1, int i2, int *ii)
{
// must i1 <= i2
if (i1 > i2) {
swap_int(&i1, &i2);
}
double x;
rnd2(s1, &x);
(*ii)= i1 + ((int) ((i2 - i1 + 1)*x));
}// end of irnd()
// ----------------------------------------------
int main(int argc, char *argv[])
{
// for rnd1(), rnd2(), irnd(), ...
int t1, t2, s1, s2, no, min, max, i, i1, i2, ii;
int u= {0};
double ct= 0.0, dt, x;
i1= 1;
i2= 6;
time1(&s1);// s1 是種子數
no= (int) (2E+8 + 0.5);
time1(&t1);
for (i=1;i<=no;i++) {
irnd(&s1, i1, i2, &ii);
u++;
}
time2(t1, &dt);
skip(3);
printf("dt= %.3lf \n", dt);
skip(3);
for (i=0;i<18;i++) {
if (u > 0)
printf("i= %5d, u= %10ld, %10.6lf \n",
i, u, (((double) u)/no));
}
pause();
return EXIT_SUCCESS;
}// end of main()
wldtw2008
發表於 12-4-12 08:23
這個問題到底是要找尋最快的方法、還是最常態分布的方法、還是最簡單的方法、還是要數量最大的亂數??
一般的RAND如果是送出0~32767 (hex: 0~ 7ffff)
那要做出上億上兆的亂數都不是問題,只要rand()*0x8000*0x8000+rand()*0x8000+rand()
就有超大的亂數了。
如果要最快的方法,那就自己寫65535個INT陣列的亂數表,以TICKTIME%65535去取值,這應該是最快的方法。
方法很多,都可以動腦想,但應該回歸原始出發點,以需求去修正/加強現有的方法,做出符合需求的功能。
meimeichen
發表於 12-4-12 08:26
既然第三個條件是 必須的 (每個亂數重複錢只能出現一次)
何不切開來處理
1.先產生1 - 10E 的數列 再用亂數交換 把序列打亂 ,把這些個序列存起來
2. 執行壓力測試的部分 循序抓 被打亂的數列
這樣 在作壓力測試的時候 還能比較 不同 做法的效率咧
akqjt
發表於 12-4-12 08:39
本帖最後由 akqjt 於 12-4-12 08:44 編輯
我也出個題目
隨機跑出1-100000的亂數表
亂數不能重複
格式
12505
2380
...
100000 958
輸出到文字檔
並秀出需要多少毫秒
lingin1204
發表於 12-4-12 09:04
期交所的工作......聽起來好像不賴?!
有人待過嗎?
無無明
發表於 12-4-12 09:07
我被打敗
阿不素要 做 壓力測試?
交易所模擬 突發性事件?
這根亂數有何關係?
要是我做壓力測試
就來給她一個 自我增長 測試送單流量
meimeichen
發表於 12-4-12 09:16
無無明 發表於 12-4-12 09:07 static/image/common/back.gif
我被打敗
阿不素要 做 壓力測試?
可能官員的腦袋問題吧
也許它們的認知亂數就代表突發狀況啊{:7_420:}
sjgau
發表於 12-4-12 09:22
以下的程式,符合 您的需求,
不考慮檔案的寫出時間
需要 60ms
可以 接受嗎?
// for fast random number generator
#include "inc-01.h"
// ----------------------------------------------
void init_rnd(int *s1)
{
int t1, t2, i;
time1(&t1);
t2= t1;
while (t1 == t2) {
time1(&t1);// get new t1
}
// t1 <> t2
for (i=0;i<300;i++) {
rnd1(&t1);
}
*s1= t1;
}// end of init_rnd()
// ----------------------------------------------
int main(int argc, char *argv[])
{
int i, s1, t1, t2, a, no;
int j, k1, k2;
double dt;
no= (int) (10E+4 + 0.5);
init_rnd(&s1);
// 3ms of next loop
for (i=0;i<=no;i++) {
a= i;
}
time1(&t1);
// 59ms of next loop
for (i=0;i<3;i++) {
for (j=0;j<no;j++) {
irnd(&s1, 1, no, &k1);
irnd(&s1, 1, no, &k2);
swap_int(&a, &a);
}
}
time2(t1, &dt);
skip(3);
for (i=1;i<=20;i++) {
printf("%5d, %10d \n", (i+1), a);
}
printf("dt= %.3lf \n", dt);
pause();
return EXIT_SUCCESS;
}// end of main()
akqjt
發表於 12-4-12 11:34
本帖最後由 akqjt 於 12-4-12 12:28 編輯
老師果然厲害60ms 很快了
bacardi
發表於 12-4-12 15:51
sjgau大的程式跟數值分析這麼強, 拿來分析大樂透, 或是百家樂, 加勒比海撲克等等一些有固定規則跟賠率的賭戲, 應該成功機率比分析股市大吧{:4_163:}
akqjt9
發表於 12-4-12 18:30
發完題目我也寫程式RUN
用公司的電腦跑
約65-75MS
回到家
換I5 2500 RUN
47MS
程式碼24行
這題目可用多重緒來寫
估計只要12MS