题目描述
假设张三的mp3里有1000首歌,现在希望设计一种随机算法来随机播放。与普通随机模式不同的是,张三希望每首歌被随机抽到的概率是与一首歌的豆瓣评分(0~10分)成正比的,如朴树的《平凡之路》评分为8.9分,逃跑计划的《夜空中最亮的星》评分为9.5分,则希望听《平凡之路》的概率与《夜空中最亮的星》的概率比为89:95,。现在我们已知这1000首歌的豆瓣评分:
(1)请设计一种随机算法来满足张三的需求。
(2)请写代码实现自己的算法。
题目分析一
①将一千首歌存在数组当中,数组下标对应0-999,数组内容存歌曲的评分;
②随机取0-999中的一个数字,取到之后查看对应的评分,如果评分为9.5,则随机取1-100中的数字,小于等于95则播放这首歌,
③重复上述②过程
题目分析二
①将一千首歌存在数组当中,数组下标对应0-999,数组内容存歌曲的评分;
②随机取0-999中的一个数字,取到之后查看对应的评分,如果评分为9.5,则随机取1-100中的数字,小于等于95则播放这首歌,
③当某一首歌曲被选中后,与最后一首歌曲调换位置,然后随机数减一,等到下一首被选中后,与倒数第二的位置交换,随机数减一,依次类推,
④重复上述②③过程。
代码实现
public class RandomSongs {//JAVA
//其实这种方法,对于那两首歌并不是完全的89:95,但是在歌曲总数 很多的情况下,很接近原始评分比例了
public int randomSong(double[] grades, int length){ //grades 是输入参数,表明每一首歌的评分,共1000个;返回值是歌曲的编号
while(true){
int x=(int)(Math.random()*(length));//首先是平等地选歌
double y=(Math.random()*10);//然后进行评分验证:
if(grades[x]>=y){
return x;
}
}
}
//可以用下面的测试方法来验证,我们举一个7首歌曲的歌单
public static void main(String[] args){
RandomSongs rs=new RandomSongs();
double[] grades={8.9, 9.0, 8.0, 6, 2, 5.1, 9.5};
int[] prob=new int[grades.length]; //prob是用来记录歌曲播放的次数
for(int i=0;i<prob.length;i++){
prob[i]=0;
}
for(int i=0;i<grades.length;i++){
//int x=rs.randomSong(grades, grades.length -1 - i);
int x = rs.randomSong(grades, grades.length);
prob[x]++;
//swap(grades,x,grades.length - 1 - i);
}
for(int i=0;i<prob.length;i++){
System.out.print(prob[i]+"\t");
}
}
public void swap(double[] arr, int a, int b){
double tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
}
输出结果:
//4 2 1 0 0 0 0
1 3 0 1 0 0 2
参考文献
[1] 设计一种随机算法来随机播放歌曲
网友评论