一个随机播放的算法II

作者: DreamWinter | 来源:发表于2018-04-17 00:39 被阅读167次

一个随机播放的算法

Idea:💡

音乐时光🎵
骑着车,戴着耳机,播放列表里有几首歌。
突然,很想听《且听风吟》,但是不想掏出手机,于是一路双击耳机播放键切歌。
emmm,下面是切过的歌:

第几次 随机到的音乐 停留的时间
1 Love Story 2s
2 东风破 3s
3 Refrain 1s
4 东风破 2s
5 Valder Fields 2s
6 Love Story 1s
7 My Soul 3s
8 白金ディスコ 1s
9 Refrain 3s
... ... ...
16 且听风吟 3min

What?一共才几首歌,而我切了十多次才随机到自己想要的!
有些歌明明已经被切掉了,为什么马上又随机到?不够聪明诶。

那么,在监听到用户正在切歌时,可不可以直接跳过刚刚已经切过的歌?
当然是可行的。于是在RandomPicker基础上实现了CutMode。进入切歌模式后,切过的歌将不会再次出现,除非一轮已经切完。

Demo

进入切歌模式的RandomPicker

如何使用

快速开始:

// 指定列表有n首歌,初始比重为1.
mRandomPicker = new RandomPicker(n, 1); 
// 进入切歌模式。
mRandomPicker.enterCutMode();
// 随机获取下一首
int nextPos = mRandomPicker.next();
...
// 退出切歌模式
mRandomPicker.exitCutMode();

更多方法:

// 更默认的比重计算器
mRandomPicker.setCalculator(new Calculator() {
@Override
public int calculateNextWeight(int currentWeight, int originWeight) {
    return (currentWeight + 1) * originWeight;
    }
 });
// 改变某个item的初始比重
mRandomPicker.changeOriginWeight(0, 3);
// 指定下次随机到的数
mRandomPicker.setNextPick(3);
//添加一个item至尾部,并为其赋值初始比重
mRandomPicker.add(2);

源码

GitHub: XunMengWinter/RandomPicker

下面贴出关键代码:

    /*执行随机算法*/
    private int randomPick() {
        // 若列表长度小于2,则下一次位置必为0.
        if (mCurrentWeightList.size() < 2) {
            return 0;
        }

        int nextPos = 0;
        // 算出下一次选中的位置
        if (mNextPickPosition != null) {
            nextPos = mNextPickPosition;
            mNextPickPosition = null;
        } else {
            int allWeight = 0;
            for (int i = 0; i < mCurrentWeightList.size(); i++) {
                allWeight += mCurrentWeightList.get(i);
            }

            if (allWeight <= 0) {
                //TODO avoid this situation.
                allWeight = Integer.MAX_VALUE;
                //Log.e(TAG, "...");
            }

            int nextPosInWeight = mRandom.nextInt(allWeight);
            int currentWeight = 0;
            for (int i = 0; i < mCurrentWeightList.size(); i++) {
                currentWeight += mCurrentWeightList.get(i);
                if (currentWeight > nextPosInWeight) {
                    nextPos = i;
                    break;
                }
            }
        }

        // 预先算好下一次的比重
        for (int i = 0; i < mCurrentWeightList.size(); i++) {
            if (isCutMode()) {
                if (mCutOutSet.contains(i)) {
                    continue;
                }
            }
            int weight = calculateWeight(mCurrentWeightList.get(i), mOriginWeightList.get(i));
            mCurrentWeightList.set(i, weight);
        }
        if (isRepeatable)
            mCurrentWeightList.set(nextPos, calculateWeight(0, mOriginWeightList.get(nextPos)));
        else
            mCurrentWeightList.set(nextPos, 0);

        if (isCutMode()) {
            mCurrentWeightList.set(nextPos, 0);
            mCutOutSet.add(nextPos);
            if (mCutOutSet.size() >= getSize())
                mCutOutSet.clear();
        }
        return nextPos;
    }

p.s. 如果你有更好的建议,请留言或者在GitHub fork并提交pull请求。

相关文章

  • 一个随机播放的算法II

    一个随机播放的算法 Idea:? 音乐时光?骑着车,戴着耳机,播放列表里有几首歌。突然,很想听《且听风吟》,但是不...

  • 洗牌算法

    音乐软件中的随机播放算法是怎样实现的? 洗牌算法(Shuffle) 生成一个随机数(Random) 这里给出洗牌算...

  • 一个随机播放的算法

    想法: 伪随机。你的音乐列表里有一些歌,每首歌的初始随机因数为1。每次你点击下一首时,每首歌的随机因数都会加1,然...

  • 音乐随机播放算法,安排!!!

    常见的音乐随机播放算法主要有两种:一是Shuffle算法;二是Random算法。 一Shuffle算法 Shuff...

  • 【python冷知识】一道课后练习题背后的知识点

    写在前面 前文回顾:【LeetCode】贪心算法--买卖股票的最佳时机 II(122) 前两天做了一个随机生成密码...

  • 随机音乐的艺术

    今天浏览Spotify官方博客时被一篇介绍音乐随机播放算法的博客吸引,随后对这个问题小小研究了一下。 随机播放音乐...

  • 设计一种随机算法来随机播放歌曲

    题目描述 假设张三的mp3里有1000首歌,现在希望设计一种随机算法来随机播放。与普通随机模式不同的是,张三希望每...

  • 按比例生成随机数求解

    假设张三的mp3里有1000首歌,现在希望设计一种随机算法来随机播放。与普通随机模式不同的是,张三希望每首歌被...

  • python-洗牌算法的实现

    简单来说 Fisher–Yates shuffle 算法是一个用来将一个有限集合生成一个随机排列的算法(数组随机排...

  • 概率与计算

    本文首发在我的博客:《概率与计算》 这是一个挖坑贴,随机算法是大数据算法中的重要的算法,《概率与计算》是讲随机算法...

网友评论

    本文标题:一个随机播放的算法II

    本文链接:https://www.haomeiwen.com/subject/xzxlkftx.html