OK論壇

 找回密碼
 註冊
查看: 1826|回復: 4

[分享] [鮭魚的原碼教室 - 函數] 時間亂數 - timerandom

[複製鏈接]
  • TA的每日心情

    2017-1-18 12:17 AM
  • 簽到天數: 512 天

    連續簽到: 1 天

    [LV.9]以壇為家II

    發表於 2013-7-23 10:06:02 | 顯示全部樓層 |閱讀模式
    本帖最後由 grass0916 於 2013-7-25 07:14 AM 編輯

    腳本指令 (script command) : timerandom

    指令作用

    真正的亂數函數, 非從亂數表中取得, 採用時間亂數。

    使用方式
    1. timerandom( <int> ) ; // 回傳 1 ~ 該整數 之間亂數
    複製代碼


    路徑 : \src\map\script.c

    找到 "struct script_function buildin_func[] = {" 此行, 於後一行加上
    1.         BUILDIN_DEF(timerandom,"i?"),
    複製代碼


    路徑 : \src\map\script.c

    找到 "// NPC interaction" 此行, 於後一行加上
    1. BUILDIN_FUNC( timerandom ) {
    2.     srand( time( NULL ) ) ;
    3.     if( script_hasdata( st, 2 ) )
    4.         script_pushint( st, rand() % script_getnum( st, 2 ) + 1 ) ;
    5.     return 0 ;
    6. }
    複製代碼


    創造原因 : eA 內建的 rand(), 並不是真正的亂數, 其實是用亂數表中取得, 並做一些 right shift 與 power 的運算,
         藉以改變他的數值達到類似亂數的作法。
         而本指令是取得本機 (server端) 的電腦時間精準度達毫秒, 用其數值來做運算達到亂數效果。

    你可以在 mt1993ar.c 中看見 函數 genrand_int32 有一行 :
    1. init_genrand(5489UL); /* a default initial seed is used */
    複製代碼
    這是從亂數表中取得的最佳佐證。













    評分

    參與人數 1積分 +66 現金 +66 積極性 +66 收起 理由
    goddameit + 66 + 66 + 66

    查看全部評分

    回復

    使用道具 舉報

  • TA的每日心情
    開心
    2023-12-30 04:16 AM
  • 簽到天數: 1322 天

    連續簽到: 1 天

    [LV.10]以壇為家III

    發表於 2013-7-23 12:32:15 | 顯示全部樓層
    本帖最後由 sinya 於 2013-7-23 12:36 PM 編輯
    回傳 1 ~ 該整數 之間亂數


    應該要有 Min~Max 亂數 才會放棄 ea 的 rand  不然還是ea功能比較好



    回復 支持 反對

    使用道具 舉報

  • TA的每日心情

    2017-1-18 12:17 AM
  • 簽到天數: 512 天

    連續簽到: 1 天

    [LV.9]以壇為家II

     樓主| 發表於 2013-7-23 12:40:25 | 顯示全部樓層
    sinya 發表於 2013-7-23 12:32 PM
    應該要有 Min~Max 亂數 才會放棄 ea 的 rand  不然還是ea功能比較好

    加幾行就好了 ...

    在實作上面, 我用的這個是被廣為使用的。

    回復 支持 反對

    使用道具 舉報

  • TA的每日心情
    開心
    2023-12-30 04:16 AM
  • 簽到天數: 1322 天

    連續簽到: 1 天

    [LV.10]以壇為家III

    發表於 2013-7-23 13:14:15 | 顯示全部樓層
    本帖最後由 sinya 於 2013-7-23 01:19 PM 編輯
    grass0916 發表於 2013-7-23 12:40 PM
    加幾行就好了 ...

    在實作上面, 我用的這個是被廣為使用的。

    這種有個缺點

    電腦跑太快 時間種子 一樣  亂數出來不會超過某個值

    你看你的圖片 沒超過75過

    回復 支持 反對

    使用道具 舉報

  • TA的每日心情

    2017-1-18 12:17 AM
  • 簽到天數: 512 天

    連續簽到: 1 天

    [LV.9]以壇為家II

     樓主| 發表於 2013-7-23 13:29:04 | 顯示全部樓層
    sinya 發表於 2013-7-23 01:14 PM
    這種有個缺點

    電腦跑太快 時間種子 一樣  亂數出來不會超過某個值

    第二行的前半段是對的, 但後半段不全然,

    再來就是它的確適合單筆取用 (以現在的PC來說運算確實太快了), 怎麼說呢各有所長。

    時間亂數最主要是能確保每次取得亂數的不一致性 (與亂數表差異在此)。

    回復 支持 反對

    使用道具 舉報

    您需要登錄後才可以回帖 登錄 | 註冊

    本版積分規則

    Archiver|手機版|小黑屋|OK討論區

    GMT+8, 2024-4-24 05:19 AM , Processed in 0.049338 second(s), 24 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回復 返回頂部 返回列表