亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C基礎 尋找隨機函數的G點詳解

2020-01-26 14:33:32
字體:
來源:轉載
供稿:網友

引言

隨機函數算法應該是計算機史上最重要的十大算法之一吧. 而C中使用的隨機函數

#include <stdlib.h>_Check_return_ _ACRTIMP int __cdecl rand(void); 

本文主要圍繞rand 函數找到G點. 就是偽隨機函數的周期值.

關于rand 源碼, 可以從Linux底層源碼 glibc中找.  看了一下大約4個文件. 算法比較復雜. 感覺很穩定.

這里不探討隨機算法的實現. 只為了找到 隨機函數周期.

前言

現在window上測試. 測試代碼 main.c

#include <stdio.h>#include <stdlib.h>#define _INT_R    (128)#define _INT_FZ    (10000000)// 得到rand() 返回值, 并寫入到文件中int getrand(long long *pcut) {  static int _cut = 0;  long long t = *pcut + 1;  int r = rand();    // 每次到萬再提醒一下  if(t % _INT_FZ == 0)    fprintf(stdout, "%d 個數據跑完了[%d, %lld]/n", _INT_FZ, _cut, t);    if(t < 0) { // 數據超標了    ++_cut;    fprintf(stderr, "Now %d T > %lld/n", _cut, t - 1);    *pcut = 0; // 重新開始一輪  }    *pcut = t;  return r;}/* * 驗證 rand 函數的周期 */int main(int argc, char* argv[]) {  int rbase[_INT_R];  int i = -1, r;  long long cut = 0;    // 先產生隨機函數  while(++i < _INT_R)    rbase[i] = getrand(&cut);    // 這里開始隨機了  for(;;) {    r = getrand(&cut);    if (r != rbase[0])      continue;    for(i=1; i<_INT_R; ++i) {      r = getrand(&cut);      if(r != rbase[i])         break;    }        // 找見了數據    if(i == _INT_R) {      printf("Now T = %lld/n", cut);      break;    }  }    system("pause");  return 0;}

主要思路是 _INT_R 128個數重疊那我們就認為. 已經找到這個周期了.

測試結果截圖是

 

主要采用 Release  X64 編譯. 為了檢驗上面結果是可以接受的, 將 _INT_R 改成1024 重新編譯一次.

運行結果如下:

 

 綜合上面我們找見了 window 上 rand 函數的 G點 是

2147483776 - 128 =  214748248

2147484672 - 1024 = 2147483648

因而得到 window 上 VS2015 編譯器的 rand G點 是 2147483648.

G點在游戲中用的很多. 例如抽獎, 掉裝備, 暴擊等等.

正文

1. 在linux 上試試水

在linux上試試 測試代碼基本一樣 rand2.c 如下 

#include <stdio.h>#include <stdlib.h>#define _INT_R    (1024)#define _INT_FZ    (100000000)// 得到rand() 返回值, 并寫入到文件中int getrand(long long *pcut) {  static int _cut = 0;  long long t = *pcut + 1;  int r = rand();    // 每次到萬再提醒一下  if(t % _INT_FZ == 0)    fprintf(stdout, "%d個數據又跑完了[%d, %lld]/n", _INT_FZ, _cut, t);    if(t < 0) { // 數據超標了    ++_cut;    fprintf(stderr, "Now %d T > %lld/n", _cut, t - 1);    *pcut = 0; // 重新開始一輪  }    *pcut = t;  return r;}/* * 驗證 rand 函數的周期 */int main(int argc, char* argv[]) {  int rbase[_INT_R];  int i = -1, r;  long long cut = 0;    // 先產生隨機函數  while(++i < _INT_R)    rbase[i] = getrand(&cut);    // 這里開始隨機了  for(;;) {    r = getrand(&cut);    if (r != rbase[0])      continue;    for(i=1; i<_INT_R; ++i) {      r = getrand(&cut);      if(r != rbase[i])         break;    }        // 找見了數據    if(i == _INT_R) {      printf("Now T = %lld/n", cut);      break;    }  }    return 0;}

編譯命令

gcc -03 -o randc2.out rand2.c

最后運行結果, 等了 好久還是沒出來.

 

Linux 上的rand 函數寫的很有水準, 分布的很隨機. 總而言之這個隨機值比較大. 但一定存在的.

有興趣的可以按照上面思路優化跑一跑. 這邊Ubuntu 是虛擬機跑的慢.

2. 繼續擴展, 減小rand 返回 MAX值 試試水

修改上面 getrand  函數

// _INT_RMAX 表示隨機數范圍 [0, 100)#define _INT_RMAX  (100)#define _INT_R    (1024)#define _INT_FZ    (10000000)// 得到rand() 返回值, 并寫入到文件中int getrand(long long *pcut) {  static int _cut = 0;  long long t = *pcut + 1;  int r = rand() % _INT_RMAX;  // 每次到萬再提醒一下  if (t % _INT_FZ == 0)    fprintf(stdout, "%d 個數據跑完了[%d, %lld]/n", _INT_FZ, _cut, t);  if (t < 0) { // 數據超標了    ++_cut;    fprintf(stderr, "Now %d T > %lld/n", _cut, t - 1);    *pcut = 0; // 重新開始一輪  }  *pcut = t;  return r;}

添加 了 取余看是否, 影響G點 測試結果

  

發現G點沒有變化. 

可以有推論: rand() 周期不隨著 二次 mod取余而改變.

因而可以放心 mod使用 偽隨機函數. G點還是那么大.

3. 最后, 贈送一個常用的 [min, max] 之間的隨機函數

/* * 返回 [min, max] 區間的隨機函數 * min  : 起始位置 * max  : 結束位置 *    : 返回[min, max]區間之內的位置 */extern int random(int min, int max);/* * 返回 [min, max] 區間的隨機函數 * min  : 起始位置 * max  : 結束位置 *    : 返回[min, max]區間之內的位置 */int random(int min, int max) {  assert(min < max);  // 正常情況  return rand() % (max - min + 1) + min;}

測試demo 代碼 結構如下 

#include <stdio.h>#include <stdlib.h>#include <time.h>#include <assert.h>/* * 返回 [min, max] 區間的隨機函數 * min  : 起始位置 * max  : 結束位置 *    : 返回[min, max]區間之內的位置 */extern int random(int min, int max);/* * C 基礎, 使用隨機函數 */int main(int argc, char* argv[]) {  int min = -5, max = 5;  int i = 0;  // 開始統一 初始化種子  srand((unsigned)time(NULL));  while(i < 100) {    printf("%3d ", random(min, max));    if (++i % 10 == 0)      putchar('/n');  }  system("pause");  return 0;}/* * 返回 [min, max] 區間的隨機函數 * min  : 起始位置 * max  : 結束位置 *    : 返回[min, max]區間之內的位置 */int random(int min, int max) {  assert(min < max);  // 正常情況  return rand() % (max - min + 1) + min;}

測試結果是

基本比較穩定. 一切都在預料之中.

總結 本文 得出兩個 推論

  a. rand()偽隨機函數, 存在G點. 并且可以找到

  b. G點 不隨著 二次 mod 取余改變.

后記

錯誤是難免的, 預祝明天愉快~~

以上這篇C基礎 尋找隨機函數的G點詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲精品久久久| 亚洲免费人成在线视频观看| 日韩精品视频三区| 精品香蕉在线观看视频一| 91精品国产色综合久久不卡98口| 成人a在线视频| 亚洲人成亚洲人成在线观看| 午夜精品久久久99热福利| 日韩av片免费在线观看| 国产精品久久久久久久久久久久| 日韩高清欧美高清| 日韩美女毛茸茸| 国产第一区电影| 国产精品久久久久7777婷婷| 国内精品小视频在线观看| 91久久精品国产91久久性色| 欧美一级在线亚洲天堂| 欧美性xxxx| 欧美成人免费va影院高清| 久久综合伊人77777| 欧美日韩人人澡狠狠躁视频| 66m—66摸成人免费视频| 97国产精品视频| 在线观看日韩视频| 成人黄色在线播放| www.亚洲一区| 欧美孕妇与黑人孕交| 久久久久久中文字幕| 成人妇女免费播放久久久| 97视频在线观看免费高清完整版在线观看| 北条麻妃久久精品| 国产精品老牛影院在线观看| 久久99久久99精品免观看粉嫩| 青草成人免费视频| 久久国产天堂福利天堂| 国产精品丝袜高跟| 亚洲精品一区在线观看香蕉| 在线亚洲午夜片av大片| 中文字幕精品在线| 欧美电影免费观看高清| 久久久久久久成人| 亚洲欧美福利视频| 国产中文字幕亚洲| 中文字幕少妇一区二区三区| 九九精品在线观看| 8090成年在线看片午夜| 亚洲欧洲日产国产网站| 亚洲国产精品美女| 中文字幕亚洲天堂| www国产精品com| 热99精品里视频精品| 欧美色另类天堂2015| 国产精品99久久久久久久久| 97精品久久久中文字幕免费| 91社区国产高清| 国语自产偷拍精品视频偷| 91精品国产自产在线观看永久| 欧美在线观看一区二区三区| 日韩av中文字幕在线| 成人av色在线观看| 国产视频精品自拍| 久久天天躁狠狠躁夜夜躁| 91精品国产综合久久香蕉最新版| 国产成人精品免高潮在线观看| 日韩成人av在线播放| 亚洲欧美国产高清va在线播| 伊人久久久久久久久久久| 一本色道久久综合狠狠躁篇怎么玩| 精品亚洲夜色av98在线观看| 黑人巨大精品欧美一区二区一视频| 久久香蕉国产线看观看av| 欧美成人免费在线视频| 欧美与黑人午夜性猛交久久久| 中文字幕精品一区二区精品| 91精品视频一区| 欧美野外wwwxxx| 色老头一区二区三区| 亚洲天堂免费在线| 国语自产在线不卡| 欧美夫妻性生活视频| 91在线精品播放| 中文字幕日韩综合av| 国产噜噜噜噜噜久久久久久久久| 一区二区欧美激情| 中文字幕日韩欧美| 国产91ⅴ在线精品免费观看| 日韩三级成人av网| 日韩电影免费在线观看| 久久影院中文字幕| 国产精品jvid在线观看蜜臀| 亚洲美女又黄又爽在线观看| 91国内精品久久| 国产精品久久久久999| 免费91麻豆精品国产自产在线观看| 亚洲a一级视频| 在线观看亚洲视频| 亚洲男女性事视频| 少妇高潮久久久久久潘金莲| 日韩av手机在线| 欧美一区三区三区高中清蜜桃| 久久久久久91香蕉国产| 日韩精品在线电影| 国产欧美欧洲在线观看| 18久久久久久| 日韩午夜在线视频| 亚洲人成毛片在线播放| 国产午夜精品视频| 91精品国产成人www| 国产偷国产偷亚洲清高网站| 亚洲永久在线观看| 国产视频观看一区| 欧美高清一级大片| 久久精品国产久精国产一老狼| 成人www视频在线观看| 亚洲欧美日韩精品久久奇米色影视| 92国产精品久久久久首页| 欧美黄色片免费观看| 国语自产偷拍精品视频偷| 久久久久久亚洲精品不卡| 久久久久久久一区二区三区| 国产美女久久精品香蕉69| 98精品国产自产在线观看| 久久久久久久999精品视频| 色综合五月天导航| 国产精品日韩在线播放| 精品高清一区二区三区| 日韩欧美亚洲范冰冰与中字| 精品美女国产在线| 中文国产成人精品久久一| 亚洲国产精品成人av| 亚洲成av人乱码色午夜| 亚洲精品在线观看www| 美日韩精品免费视频| 亚洲女同性videos| 日韩精品中文字幕在线| 国产主播精品在线| 久久精品国产一区二区电影| 色综合久久悠悠| 日韩av网站大全| 亚洲精品国精品久久99热一| 亚洲国产日韩精品在线| 69av在线播放| 成人激情视频在线| 亚洲欧美中文日韩在线v日本| 中文日韩在线视频| 久久久精品在线| 午夜精品久久17c| 国产精品久久久久久久久久ktv| 乱亲女秽乱长久久久| 亚洲综合社区网| 97超碰蝌蚪网人人做人人爽| 日韩免费在线免费观看| 国产成人在线一区| 色婷婷亚洲mv天堂mv在影片| 欧美在线亚洲一区| 中文字幕欧美日韩在线| 91亚洲精华国产精华| 欧美黑人狂野猛交老妇| 久久99精品视频一区97| 久久99精品久久久久久青青91| 国产精品偷伦一区二区| 91精品视频免费看| 日韩美女写真福利在线观看| 亚洲精品综合久久中文字幕|