# 一个随机播放的算法II

### Idea：?

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？一共才几首歌，而我切了十多次才随机到自己想要的！ 有些歌明明已经被切掉了，为什么马上又随机到？不够聪明诶。

### 如何使用

```// 指定列表有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至尾部，并为其赋值初始比重

### 源码

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);
if (mCutOutSet.size() >= getSize())
mCutOutSet.clear();
}
return nextPos;
}```

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

0 条评论

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

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

• ### 深度 | 朴素贝叶斯模型算法研究与实例分析

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

• ### 暗通道去雾算法原理及实现

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

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

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

• ### 吴恩达深度学习笔记 3.1~3.11 浅层神经网络

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

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

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

• ### ZooKeeper典型应用场景一览（转）

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

• ### 伪随机数生成算法

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