COCO研究院

 找回密碼
 註冊
搜索
樓主: sjgau

[其他程式語言] 幾個副程式,把一個學生輔導送進 期交所寫程式

[複製鏈接]
發表於 12-4-11 22:43 | 顯示全部樓層
sjgau 發表於 12-4-11 21:18
我的建議是
搞一個 counter, 紀錄啟動以後的 一些使用者有關的動作的
時間間隔

嗯..這也是一個解法。

有一種解法,
是用一個counter,並且將這個數值偷存在flash之類不會因為關電而消失的儲存元件裡。
這個一直累加的東西就可以當種子。
(不能因為關電而消失..否則每次一開電,行為就一模一樣)

 樓主| 發表於 12-4-11 22:54 | 顯示全部樓層
綠茶妹 發表於 12-4-11 22:43
嗯..這也是一個解法。

有一種解法,

存放 flash 是正解,

然後,找一些跟使用者操作有關的訊息
隨時去改變 亂數的種子數


發表於 12-4-11 23:42 | 顯示全部樓層
其實,玩程式 跟 玩交易有很大、很大的差別…

很多程式交易穩定賺很多coco的交易員,程式寫的真的不怎麼樣的……
 樓主| 發表於 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()

 樓主| 發表於 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[18]= {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[ii+6]++;
   }
   time2(t1, &dt);
   
   skip(3);
   printf("dt= %.3lf \n", dt);
   
   skip(3);
   for (i=0;i<18;i++) {
      if (u[i] > 0)  
      printf("i= %5d, u[i]= %10ld, %10.6lf \n",
      i, u[i], (((double) u[i])/no));
   }
   
   pause();
   return EXIT_SUCCESS;
}// end of main()
發表於 12-4-12 08:23 | 顯示全部樓層
這個問題到底是要找尋最快的方法、還是最常態分布的方法、還是最簡單的方法、還是要數量最大的亂數??

一般的RAND如果是送出0~32767 (hex: 0~ 7ffff)
那要做出上億上兆的亂數都不是問題,只要rand()*0x8000*0x8000+rand()*0x8000+rand()
就有超大的亂數了。

如果要最快的方法,那就自己寫65535個INT陣列的亂數表,以TICKTIME%65535去取值,這應該是最快的方法。

方法很多,都可以動腦想,但應該回歸原始出發點,以需求去修正/加強現有的方法,做出符合需求的功能。
發表於 12-4-12 08:26 | 顯示全部樓層
既然第三個條件是 必須的 (每個亂數重複錢只能出現一次)
何不切開來處理
1.  先產生  1 - 10E 的數列 再用亂數交換 把序列打亂 ,把這些個序列存起來
2. 執行壓力測試的部分 循序抓 被打亂的數列

這樣 在作壓力測試的時候 還能比較 不同 做法的效率咧
發表於 12-4-12 08:39 | 顯示全部樓層
本帖最後由 akqjt 於 12-4-12 08:44 編輯

我也出個題目

隨機跑出1-100000的亂數表
亂數不能重複
格式
1  2505
2  380
...
100000    958
輸出到文字檔
並秀出需要多少毫秒

評分

參與人數 1金錢 +1 收起 理由
sjgau + 1 按一個讚!

查看全部評分

發表於 12-4-12 09:04 | 顯示全部樓層
期交所的工作......聽起來好像不賴?!
有人待過嗎?
發表於 12-4-12 09:07 | 顯示全部樓層
我被打敗

阿不素要 做 壓力測試?
交易所模擬 突發性事件?

這根亂數有何關係?

要是我做壓力測試
就來給她一個 自我增長 測試送單流量

評分

參與人數 1金錢 +2 收起 理由
philipz + 2 本日最中肯!

查看全部評分

發表於 12-4-12 09:16 | 顯示全部樓層
無無明 發表於 12-4-12 09:07
我被打敗

阿不素要 做 壓力測試?

可能官員的腦袋問題吧

也許它們的認知  亂數就代表突發狀況啊
 樓主| 發表於 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[100001], 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]= 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[k1], &a[k2]);
      }
   }
   time2(t1, &dt);
   
   skip(3);
   for (i=1;i<=20;i++) {
      printf("%5d, %10d \n", (i+1), a[i]);
   }
   printf("dt= %.3lf \n", dt);
   pause();
   
   return EXIT_SUCCESS;
}// end of main()

發表於 12-4-12 11:34 | 顯示全部樓層
本帖最後由 akqjt 於 12-4-12 12:28 編輯

老師果然厲害  60ms 很快了  







發表於 12-4-12 15:51 | 顯示全部樓層
sjgau大的程式跟數值分析這麼強, 拿來分析大樂透, 或是百家樂, 加勒比海撲克等等一些有固定規則跟賠率的賭戲, 應該成功機率比分析股市大吧  
發表於 12-4-12 18:30 | 顯示全部樓層
發完題目我也寫程式RUN
用公司的電腦跑
約65-75MS

回到家
換I5 2500 RUN
47MS
程式碼24行

這題目可用多重緒來寫
估計只要12MS
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-6-15 17:27

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |