专栏首页Winter漫聊技术一个随机播放的算法II

一个随机播放的算法II

一个随机播放的算法

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请求。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 亚像素数值极值检测算法总结

    在计算机视觉领域,经常需要检测极值位置,比如SIFT关键点检测、模板匹配获得最大响应位置、统计直方图峰值位置、边缘检测等等,有时只需要像素精度就可以,有时则需要...

    李拜六不开鑫
  • 深度 | 朴素贝叶斯模型算法研究与实例分析

    本节介绍朴素贝叶斯分类算法模型在中文领域中的应用。我们对新闻语料进行多文本分类操作,本文选择艺术、文学、教育、哲学、历史五个类别的训练文本,然后采用新的测试语料...

    伏草惟存
  • 暗通道去雾算法原理及实现

    基本原理来源于何凯明大神的CVPR09的论文Single Image Haze Removal Using Dark Channel Prior

    和蔼的zhxing
  • 理论 | 朴素贝叶斯模型算法研究与实例分析

    朴素贝叶斯是一种构建分类器的简单方法。该分类器模型会给问题实例分配用特征值表示的类标签,类标签取自有限集合。所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不...

    伏草惟存
  • 吴恩达深度学习笔记 3.1~3.11 浅层神经网络

    神经网络的结构与逻辑回归类似,只是神经网络的层数比逻辑回归多了一层,多出的中间一层叫隐藏层,那么,神经网络的计算就相当于多进行一次逻辑回归的计算

    Dar_Alpha
  • 实现 | 朴素贝叶斯模型算法研究与实例分析

    构建一个快速过滤器来屏蔽在线社区留言板上的侮辱性言论。如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标识为内容不当。对此问题建立两个类别: 侮辱类和非侮...

    伏草惟存
  • ZooKeeper典型应用场景一览(转)

    ZooKeeper是一个高可用的分布式数据管理与系统协调框架。基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得Z...

    会跳舞的机器人
  • 伪随机数生成算法

    伪随机数生成算法在计算机科学领域应用广泛,比如枪击游戏里子弹命中扰动、数据科学里对样本进行随机采样、密码设计、仿真领域等等,背后都会用到伪随机数生成算法。

    李拜六不开鑫
  • 排序算法

    ppjun

扫码关注云+社区

领取腾讯云代金券