国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C基礎 尋找隨機函數的G點詳解

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

2021-04-06 13:37C語言教程網 C/C++

下面小編就為大家帶來一篇C基礎 尋找隨機函數的G點詳解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

引言

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

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

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

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

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

前言

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#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個數重疊那我們就認為. 已經找到這個周期了.

測試結果截圖是

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

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

運行結果如下:

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

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

2147483776 - 128 =  214748248

2147484672 - 1024 = 2147483648

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

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

正文

1. 在linux 上試試水

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#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

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

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

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

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

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

修改上面 getrand  函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// _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點 測試結果

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

發現G點沒有變化. 

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * 返回 [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 代碼 結構如下 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#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;
}

測試結果是

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

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

總結 本文 得出兩個 推論

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

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

后記

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

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

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
主站蜘蛛池模板: 中文字幕日韩视频 | 福利在线观看 | 精品国产91 | 狠狠色综合网站久久久久久久 | 日韩精品免费一区二区夜夜嗨 | 欧美一区二区在线视频 | 欧美成人一区二区三区片免费 | 99精品国产高清在线观看 | 免费一级 国产 | 亚洲国产成人精品久久久国产成人一区 | 久久99精品国产麻豆婷婷洗澡 | 日韩精品视频在线播放 | 免费a爱片猛猛 | 一级黄色片视频 | 成人深夜福利 | 成人乱人乱一区二区三区 | 亚洲一区二区在线播放 | 91免费观看视频 | 91久久久久久久久 | 色婷婷久久一区二区三区麻豆 | 久久99精品国产自在现线 | 久久久久无码国产精品一区 | 久久久久久亚洲精品中文字幕 | 视频一区在线观看 | 日韩综合网 | 精品国产999| 久久久久久久久久一区二区 | 中文区永久区 | 免费成人av网站 | 日韩三级电影 | 日韩欧美国产精品 | 久久精品国产77777蜜臀 | 噜噜噜在线观看免费视频日本 | 久久精品无码一区二区三区 | 精品国产免费人成在线观看 | 黄色一级大片在线免费看产 | 免费裸体无遮挡黄网站免费看 | 中文字幕视频二区 | 久久人人爽爽爽人久久久 | 日韩色区| 久色视频在线观看 |