網站首頁 編程語言 正文
引言
你是否有過類似的煩惱?想從一個列表中取出若干個不重復的元素,但是不知道要如何去重? 這里提供一種叫random shuffle的方法。
random shuffle
原理
shuffle有洗牌的意思,該方法也類似洗牌,從一個列表的前綴中隨機取一個位置,和前綴的末尾做交換,這樣對于每一位,都類似洗牌把它隨機插進前面某個位置,就能實現把整個列表打亂成隨機的分布,最后我們只需要取打亂后列表的前iii位,即是不重復的了。
實現
template <typename T>
vector<T> my_random_shuffle(vector<T> input)
{
static mt19937 rnd(time(NULL));
for(uint64_t i=1; i<input.size(); i++)
{
swap(input[i], input[rnd()%i]);
}
return input;
}
測試
對1?1001-1001?100進行random shuffle,統計每個位置出現的值的期望,一共隨機1e5次,觀察每個位置的期望值。
測試方式
int main(int argc, char *argv[])
{
int n=100;
int t=1e5;
vector<double> input(n);
vector<double> ans(n,0);
for(int i=0;i<n;i++)
{
input[i]=i+1;
}
for(int i=0;i<t;i++)
{
int j=0;
for(auto x:my_random_shuffle(input))
{
ans[j]+=x;
j++;
}
}
for(auto &x:ans)
{
x/=t;
}
for(int i=0;i<n;i++)
{
cout<<ans[i]<<"\t\t";
if(i%4==3)cout<<"\n";
}
}
測試結果
50.9806?? ??? ?50.9978?? ??? ?50.9801?? ??? ?50.9618?? ??? ?
50.9662?? ??? ?50.9486?? ??? ?50.9348?? ??? ?50.9374?? ??? ?
50.9013?? ??? ?50.8675?? ??? ?50.9274?? ??? ?50.8882?? ??? ?
50.8748?? ??? ?50.8656?? ??? ?50.8555?? ??? ?50.8352?? ??? ?
50.8218?? ??? ?50.833?? ??? ?50.7876?? ??? ?50.8293?? ??? ?
50.8174?? ??? ?50.7475?? ??? ?50.7833?? ??? ?50.7234?? ??? ?
50.7935?? ??? ?50.7652?? ??? ?50.7787?? ??? ?50.6877?? ??? ?
50.7578?? ??? ?50.7193?? ??? ?50.694?? ??? ?50.6374?? ??? ?
50.7106?? ??? ?50.6737?? ??? ?50.6511?? ??? ?50.643?? ??? ?
50.6365?? ??? ?50.6079?? ??? ?50.6261?? ??? ?50.5958?? ??? ?
50.5886?? ??? ?50.5561?? ??? ?50.5837?? ??? ?50.602?? ??? ?
50.5241?? ??? ?50.559?? ??? ?50.5806?? ??? ?50.5683?? ??? ?
50.4943?? ??? ?50.5168?? ??? ?50.4743?? ??? ?50.4901?? ??? ?
50.479?? ??? ?50.4729?? ??? ?50.4745?? ??? ?50.4282?? ??? ?
50.4521?? ??? ?50.3626?? ??? ?50.4005?? ??? ?50.4381?? ??? ?
50.3373?? ??? ?50.3543?? ??? ?50.3738?? ??? ?50.4259?? ??? ?
50.3071?? ??? ?50.3403?? ??? ?50.2773?? ??? ?50.2991?? ??? ?
50.3485?? ??? ?50.3301?? ??? ?50.3087?? ??? ?50.2954?? ??? ?
50.2216?? ??? ?50.2597?? ??? ?50.2882?? ??? ?50.2848?? ??? ?
50.2375?? ??? ?50.2224?? ??? ?50.214?? ??? ?50.2504?? ??? ?
50.1656?? ??? ?50.14?? ??? ?50.1304?? ??? ?50.1726?? ??? ?
50.2319?? ??? ?50.1579?? ??? ?50.1599?? ??? ?50.1223?? ??? ?
50.1396?? ??? ?50.029?? ??? ?50.0759?? ??? ?50.1079?? ??? ?
50.0573?? ??? ?50.0219?? ??? ?50.0716?? ??? ?50.0642?? ??? ?
49.9957?? ??? ?50.0364?? ??? ?50.0604?? ??? ?49.9931?? ?
可以觀察到結果的期望分布十分均勻,都在50上下。
原文鏈接:https://juejin.cn/post/7093484844918931464
相關推薦
- 2022-12-04 深入了解Rust的切片使用_Rust語言
- 2022-11-08 PostgreSQL查看帶有綁定變量SQL的通用方法詳解_PostgreSQL
- 2022-04-20 Python設計模式結構型享元模式_python
- 2022-09-23 C/C++中的靜態變量注意事項_C 語言
- 2022-05-11 JPA報錯IllegalArgumentException
- 2022-07-07 C語言用Easyx繪制圍棋和象棋的棋盤_C 語言
- 2022-05-13 C++ 減少臨時字符串對象的產生
- 2022-11-03 淺析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同步修改后的遠程分支