(算法)随机播放歌曲

题目:

假设张三的mp3里有1000首歌,现在希望设计一种随机算法来随机播放。与普通随机模式不同的是,张三希望每首歌被随机抽到的概率是与一首歌的豆瓣评分(0~10分)成正比的,如朴树的《平凡之路》评分为8.9分,逃跑计划的《夜空中最亮的星》评分为9.5分,则希望听《平凡之路》的概率与《夜空中最亮的星》的概率比为89:95,。现在我们已知这1000首歌的豆瓣评分:
    (1)请设计一种随机算法来满足张三的需求。
    (2)请写代码实现自己的算法。

思路:

将1000首歌的豆瓣评分累加起来,成为一条1000个区间的数轴,每个区间代表一首歌曲,在每个区间内是均匀分布的,而区间与区间之间满足概率与豆瓣评分成正比。

这样,通过产生一个[0,totalScore]间的随机浮点数,落在哪个区间就播放哪首歌曲。

代码:

#include <iostream>
#include <time.h>
#include <stdlib.h>

using namespace std;

int findIdx(double songs[],int n,double rnd){
    int left=0;
    int right=n-1;
    int mid;
    while(left<=right){
        mid=(left+right)/2;
        if((songs[mid-1]<=rnd) && (songs[mid]>=rnd))
            return mid;
        if(songs[mid]>rnd)
            right=mid-1;
        else
            left=mid+1;
    }
//    return mid;
}

int randomPlaySong(double sum_scores[],int n){
    double mx=sum_scores[n-1];
    double rnd= rand()*mx/(double)(RAND_MAX);
    return findIdx(sum_scores,n,rnd);
}

int main()
{
    srand(time(0));
    double scores[]={5.5,6.5,4.5,8.5,9.5,7.5,3.5,5.0,8.0,2.0};
    int n=sizeof(scores)/sizeof(scores[0]);
    double sum_scores[n];
    sum_scores[0]=scores[0];

    for(int i=1;i<n;i++)
        sum_scores[i]=sum_scores[i-1]+scores[i];

    cout<<"Calculate the probability of each song: "<<endl;
    int totalScore=sum_scores[n-1];
    for(int i=0;i<n;i++)
        cout<<scores[i]/totalScore<<" ";
    cout<<endl;

    int counts[n];
    for(int i=0;i<n;i++)
        counts[i]=0;

    int i=0;
    int idx;
    int MAX_ITER=100000000;
    while(i<MAX_ITER){
        idx=randomPlaySong(sum_scores,n);
        counts[idx]++;
        i++;
    }

    cout<<"After simulation, probability of each song: "<<endl;
    for(int i=0;i<n;i++)
        cout<<1.0*counts[i]/MAX_ITER<<" ";
    cout<<endl;

    return 0;
}

运行结果:

基于豆瓣评分的每首歌曲的概率以及一亿次的随机试验结果,可以看出基本一致:

时间: 2024-12-12 10:46:18

(算法)随机播放歌曲的相关文章

Python随机播放电脑里的音乐

就是找到硬盘中所有的MP3文件和wma文件,再随机打开其中的一个. import os,random disk=['D','E','F','G','H'] def search_file(filename,search_path,pathsep=os.pathsep): for path in search_path.split(pathsep): candidate = os.path.join(path,filename) if os.path.isfile(candidate): retu

[转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件

原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件 折腾: C#中如何在右下角添加提示窗口,用于显示打开文件和文件夹 的过程中,需要实现,点击对应LinkLabel后,调用资源管理器,打开对应的文件夹. [

小例子: 播放歌曲(mplayer + jobs + fg)

需求: mplayer播放歌曲系列时,希望播放全部后,听不完的可以下次继续听下去. 分析: 播放全部音频 放到背景中暂停 下次拿出来继续播放 听完后继续放到背景中暂停 方法一: $ mplayer * [播放音频] $ ctrl + z [放到背景中,并暂停播放] $ jobs -l [查看背景中的所有工作] $ fg %number [将背景中编号为number的工作拿到前景中继续工作] 方法二: $ mplayer * $ 空格键 [暂停,Terminal不关闭] 说明: mplayer使用

Windows 10 设置随机播放 桌面背景(壁纸)的方法

在刚刚发布Windows 10里,壁纸无法设置随机播放了,只能一个接一个的顺序播放. 要想进行随机播放,在命令行执行这条命令,即可调出传统的设置界面: control /name Microsoft.Personalization /page pageWallpaper 然后,把“无序播放”勾选即可,如图: 来源:https://www.reddit.com/r/wallpapers/comments/3fec2g/windows_10_random_wallpaper_slideshow/

使用JavaScript脚本控制媒体播放(顺序播放和随机播放)

在JavaScript脚本中获取<audio.../>元素对应的对象为HTMLAudioElement对象,<video.../>元素对应的对象为HTMLVideoElement对象. HTMLAudioElement对象和HTMLVideoElement对象支持的方法有如下几个: play():播放视频.音频 pause():暂停播放 load():重新装载音频.视频文件 canPlayType(type):判断该元素是否可以播放type类型的音频.视频.该属性指定该音频.视频文

算法-随机不重复数列生成

今天上班的时候网上看到题目很简单,题目是这样的:给定一个正整数n,需要输出一个长度为n的数组,数组元素是随机数,范围为0 – n-1,且元素不能重复.比如 n = 3 时,需要获取一个长度为3的数组,元素范围为0-2:简单的理解就是生成一个无序的随机数组,在路上想了一下回来用三种方式方式实现了一下:OC实现了一下,文章最末尾顺便有C#的是实现方法: 永远的While while基本上学过语言的最开始的流程分支语句都会涉及到while,如果存在就一直随机,不存在就跳出判断,一般最开始想到都是这样方

机器学习算法整理(四)集成算法—随机森林模型

随机:数据采样随机,特征选择随机 (数据采样,有放回) 原文地址:https://www.cnblogs.com/douzujun/p/8386930.html

实验三+158+余超勇

实验三 功能性测试用例设计(4学时) 一.实验目的 掌握黑盒测试用例设计方法 二.实验要求 (1)对被测程序进行黑盒测试用例设计. (2)运用等价类.边界值.决策表.状态图法等进行测试用例设计. (3)对手机上任意一款音乐软件进行黑盒测试实践. 三.实验内容 1.对被测程序运用不同的测试技巧进行测试用例设计,并执行测试,撰写测试小结. 要求写出测试用例表.执行情况和测试小结. 测试连接:http://www.cnblogs.com/5257yu/p/6838362.html 2.对手机上任意一款

实验三+140+阮晨曦

1. 代码链接 http://www.cnblogs.com/chenxxiaol/p/6804119.html 2. 界面设计 3. 等价类测试 分析题目 得出对输入的条件要求为 (1)      整数 (2)      三个数 (3)      1≤a≤100 (4)      1≤b≤100 (5)      1≤c≤100 (6)      a<b+c (7)      b<a+ c (8)      c<a+ b (9)    等腰三角形 (10)   等边三角形 (11)