網站首頁 編程語言 正文
0. 引言
小游戲中時常要用到隨機數,今天就來談談這個所謂的“隨機”。
1. 隨機數 rand()
我們要使用隨機數(嚴格意義上是偽隨機)的話,C++ 中就有 rand()
來提供了這一操作。
rand()
返回值是整數。在不同系統的編譯器下,返回值的范圍不同,我們姑且認為足夠我們使用。
設我們要獲取數x,逐步推導:
當x∈[0,100] 時,可以寫成 rand()%101;
當 x∈[1,100] 時,可以轉化為x′+1(x′∈[0,99]),寫成 rand()%100+1;
當x∈[l,r] 時,可以轉化為x′+l(x′∈[0,r?l]),寫成 rand()%(r-l+1)+l。
可現實總是不盡如人意:
為什么每次隨機出來的序列都是一樣的呢?這里我們就要講到下面的東西了
2. 設置隨機種子 srand()
畢竟是偽隨機,所以每次生成的隨機序列需要有一個初始的隨機種子(無符號整數),srand()
提供了這一操作。
比如設置隨機種子為114514,可以寫成 srand(114514);
。
然而
這意味著種子要隨機。
3. 時間 time()
time()
返回從 1970.1.1 1970.1.1 1970.1.1 至今的秒數,參數直接填 NULL
或 0 0 0(也就是空指針)即可。
設置為種子,也就是 srand(time(0));
。
效果顯著:
4. 隨機排列 random_shuffle()
如果有一個數組 a a a,如何讓其進行隨機排列呢?
C++ 有函數 random_shuffle()
。
參數和用法與 sort()
類似,直接調用即可。
示例代碼:
#include<bits/stdc++.h> using namespace std; int main() { srand(time(0)); int n,a[105]; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } random_shuffle(a+1,a+n+1); for(int i=1;i<=n;i++) { cout<<a[i]<<' '; } return 0; }
效果:
5. 隨機基本案例
5-1. 隨機 01 矩陣
給定邊長n,要求生成一個隨機 01 矩陣。
示例代碼:
#include<bits/stdc++.h> using namespace std; int main() { srand(time(0)); int n; cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cout<<rand()%2; } cout<<endl; } return 0; }
效果:
5-2. 隨機區間
給定n,要求生成n個區間[l,r](l≤r),并且這些區間是[1,n]的子區間。
每次分別對于l,r隨機,然后調整l,r大小位置。
示例代碼:
#include<bits/stdc++.h> using namespace std; int main() { srand(time(0)); int n; cin>>n; for(int i=1;i<=n;i++) { int l=rand()%n+1,r=rand()%n+1; if(l>r) swap(l,r);//防止 l>r cout<<l<<' '<<r<<endl; } return 0; }
效果:
5-3. 隨機浮點數
給定n和k,要求生成n個[0,n] 的k位浮點數(不可以有后綴0)。
分成整數部分和小數部分考慮。
整數部分生成[0,n] 的整數,小數部分生成k位 [0,9] 的數(在位數允許時,可以生成一個[0,10k?1] 的整數代替小數)。
當然,要特判整數為n的情況。若小數部分>0,就不在[0,n]內了。
處理后綴0時,只要把其存進字符串處理即可。
示例代碼:
#include<bits/stdc++.h> using namespace std; int main() { srand(time(0)); int n,k; cin>>n>>k; for(int i=1;i<=n;i++) { int d=rand()%(n+1); cout<<d; if(d==n) { cout<<endl; continue; } string s="."; for(int j=1;j<=k;j++) { s+=(char)(rand()%10+48); } while(s[s.size()-1]=='0'&&s.size()>2) s.erase(s.size()-1);//防止后綴 0 cout<<s<<endl; } return 0; }
效果:
5-4. 隨機整數
給定n,l,r(l,r∈Z,l≤r),要求生成n個整數x(x∈[l,r])。
可能含有負數,該怎么辦呢?
分三類討論:
1.當l≤r≤0 時,先輸出 -
,然后生成[∣r∣,∣l∣] 范圍的整數。
2.當l≤0≤r 時,先隨機t=0或1來確定符號。
- 當t=0時,輸出
-
,生成[0,∣l∣] 的整數。 - 當t=1時,生成[0,r]的整數。
3.當0≤l≤r時,直接生成[l,r] 的整數。
注意以上操作中輸出 -0
的情況要處理一下。
示例代碼:
#include<bits/stdc++.h> using namespace std; int main() { srand(time(0)); int n,l,r; cin>>n>>l>>r; while(n--) { if(l<=r&&r<=0) { int d=rand()%(abs(l)-abs(r)+1)+abs(r); if(d) cout<<'-';//防止 -0 cout<<d; } else if(l<=0&&0<=r) { int f=rand()%2; if(f) cout<<rand()%(r+1); else { int d=rand()%(abs(l)+1); if(d) cout<<'-';//防止 -0 cout<<d; } } else cout<<rand()%(r-l+1)+l; puts(""); } return 0; }
效果:
原文鏈接:https://blog.csdn.net/Leo_Chenjy/article/details/127695559
相關推薦
- 2022-05-20 nginx刷新頁面出現404解決方案(親測有效)_nginx
- 2022-12-21 使用RedisAtomicInteger計數出現少計問題及解決_Redis
- 2022-11-09 Python有序容器的?sort?方法詳解_python
- 2022-12-02 React函數式組件Hook中的useState函數的詳細解析_React
- 2022-08-06 SQL?Server備份數據庫的完整步驟_MsSql
- 2022-04-18 2.* 版本taro引入 taro-ui編譯小程序階段報錯, Module not found: C
- 2022-04-08 一起來看看五條Python中的隱含特性_python
- 2022-04-09 C++實現加減乘除計算器_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支