用set做一轮无重复纯随机

前端时间面腾讯的时候,一位老师问了一个相当有趣的问题:假设存在一个音乐播放器,里面有一个100首歌的歌单。现在需要做一个随机播放功能,要求不重复的随机播放完一百首歌。当时脑子短路了没想出来,几天突然意识到了问题的解法。

定义一个集合,将歌曲按照编号1-100存进集合,根据集合中剩余的元素数量做rand,每一次播放后删除即可。

简单写了点代码:

#include <iostream>
#include <set>
#include <time.h>
using namespace std;

int main() {
    srand(time(0));
    set <int> st;
    for (int i = 1; i <= 10; i++) {
        st.insert(i);
    }
    while (!st.empty()) {
        int pos = rand() % st.size();
        auto iter = st.begin();
        for (int i = 0; i < pos; i++) {
            iter++;
        }
        cout << *iter << " ";
        st.erase(iter);
    }
    return 0;
}

 

posted @ 2023-02-19 22:42  真昼小天使daisuki  阅读(46)  评论(0)    收藏  举报