建站教程

建站教程

Products

当前位置:首页 > 建站教程 >

"随机播放"是如何实现的?涉及什么原理?

GG网络技术分享 2025-03-18 16:10 1


额,以前自学过一点编程。

随机歌曲效果,首先你的歌曲库每首歌名有对应的编号123456。然后写程序的时候取随机数,然后让它播对应编号的歌曲就行

#####

C/C++中我只知道,包含头文件c语言<time.h>,或者c++头文件<ctime>。然后随机种子,srand((unsigned int)time(NULL)),最后就看你播放列表总歌曲数N,每次rand()%N的结果就是下次或者现在播放的歌曲,当然也可以先用一个临时保存每次随机出来的数,判断是否与正在播放的一样,一样就继续随机到不一样就跳出循环。我想你既然已经可以实现播放,那么列表控件,或者说列表容器中,应该很好获取当前或者说,很好设置将来播放或者现在正在播放什么吧,就好比下拉框,选项更改,肯定触发相关事件,我觉得随机播放,不是很简单吗?

#####

据我所知,随机播放是代码写好的,不是完全随机。完全随机很可能发生的事就是12139,而大多数人觉得121不科学,刚刚还听过1,现在隔了一首歌,又来1,但其实概率学是可能的,概率还不小。所以为了营造一种“随机”,所以都是代码写好的。

#####

首先把播放内容罗列到一个表里,然后通过随机函数取得该表的某一个ID(随机),然后把该ID指向的内容读入播放器播放。

#####

真随机就是1到10的数字,重复111111111。假随机1到10的数字例如135792468...真随机一般都是采用不被人为干扰的大气噪音等系数。所以我现在如果采用大自然中风的风速,来做随机数的话,现在如果这段时间一直没有风那么随机的数字也就是一直是1

#####

随机数字 听语音

(1)生成随机数比较简单,=rand()即可生成0-RAND_MAX之间的随机数;(#define RAND_MAX 0x7fffu)(2)如果要是整数,就用=int(rand()%10),表示0至9的整数,以此类推;(3)如果要生成a与b之间的随机实数,就用=rand()%(b-a+1)+a,就能产生固定位数的整数了,以此类推;注意:如果要使用函数rand()生成一随机数,并且使之不随

单元格

计算而改变,可以在编辑栏中输入“=rand()”,保持编辑状态,然后按F9,将公式永久性地改为随机数。不过,这样只能一个一个的永久性更改,如果数字比较多,也可以全部选择之后,另外选择一个合适的位置粘贴,粘贴的方法是点击右键,选择“

选择性粘贴

”,然后选择“数值”,即可将之前复制的随机数公式产生的数值(而不是公式)复制下来。

解释#include <stdlib.h>rand()srand()标准C库中函数rand()可以生成0~

RAND_MAX

之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。rand()函数没有输入参数,直接通过

表达式

rand()来引用;例如可以用下面的语句来打印两个随机数:printf(\\\"Random numbers are: %i %i\\n\\\",rand(),rand());因为rand()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的两个值,所以说C语言的随机并不是真正意义上的随机。为了使程序在每次执行时都能生成一个新序列的随机值,我们通常通过为随机数生成器提供一粒新的

随机种子

。函数 srand()(来自stdlib.h)可以为随机数生成器播散种子。只要种子不同rand()函数就会产生不同的随机数序列。srand()称为随机数生成器的

初始化器

例程

文件名: rand_srand.c

/*Thisprogramgeneratesandprintstenrandomintegersbetween1andRAND_MAX*/

#include<stdio.h>

#include<stdlib.h>

intmain()

{

unsignedintseed;/*申明初始化器的种子,注意是usignedint型的*/

intk;

printf(\\\"Enterapositiveintegerseedvalue:\\n\\\");

scanf(\\\"%u\\\",&seed);

srand(seed);

printf(\\\"RandomNumbersare:\\n\\\");

for(k=1;k<=10;k++)

{

printf(\\\"%i\\\",rand());

printf(\\\"\\n\\\");

}

return0;

}

当提供的种子相同时,随机数序列也时相同的。而且当种子为1时,与不使用srand()函数时一样的,也就是说rand()函数默认情况下初始化种子值为1;在stdlib.h 中这两个函数的原型是:int rand();void srand (unsigned int);srand(time(0)); i=rand(); 这样i就是一个真正意义上的随机数。

原因

rand()产生

伪随机数

,srand函数提供种子,种子不同产生的随机数序列也不同,所以通常先调用srand函数 time(0)返回的是系统的时间(从1970.1.1午夜算起),单位:秒,种子不同当然产生的随机数相同几率就很小了。#####

音乐播放中的随机并不是真的随机播放,而是shuffle。可以百度一下shuffle算法。

#####

这个实现起来很简单,假如说我有10首歌,那么我每次在选下首歌时产生一个0到1之间的随机数,然后10*这个随机数作为下一首待播放的歌。

如果稍微复杂一点的就是随机选择没选择过的歌曲里面的一首,那么可以将播放后的歌曲ID移除列表的集合,然后再对剩余的按照一步的算法进行选择。

等所有歌曲播放一遍后,把已播放的都标记为未播放

#####

其实这也不是什么高深的技术。

作为一个程序员的我来给你说说吧,这个在编程当中,只要编写一个小小的程序就可完美解决。

就好比0-9这十个数字,我们要随机选择一个,如果是人呢,随便选没问题。可是机器没有思想啊,怎么办?

初级的想法的就是让它加2或者减3之类的,这算法就比较粗糙了,随机的原则就过分简单,每次只是播放2的倍数歌曲。

所以我们得有一个复杂的算法,那就是一个随机函数,这个系统已经编写好了,我们只要调用即可。至于是什么算法,如果你有至于当程序员的话,可以了解,不然就浅尝辄止吧。

不然跟行如隔山,只能说它调用的是时间这个种子,这才有了随机变化的可能!

#####

我先声明一下,这个是摘自网络的!!!

一种随机播放系统及方法,对播放的媒体文件组成的播放列表进行处理,决定该媒体文件的播放状态。该系统包括:第一缓存器,记录该播放列表中包含的媒体文件数量;第二缓存器,由多个位组成,该各个位分别对应于该播放列表中的一媒体文件,标示该播放列表中各媒体文件的当前播放状态;选择模块,在执行播放任务时,根据该播放列表中随机选取一媒体文件;分析模块,依据该第二缓存器的存储数据分析该选择模块选取的媒体文件的播放状态;以及播放模块,用来在该分析模块的分析结果为该媒体文件未播放过时,播放该媒体文件;本发明的随机播放系统及方法可实现播放列表中各媒体文件在同一循环中,都能被播放,达到无重复随机播放的功效。

事实上计算机做不到真正的随机,它提供的随机只是基于某种特定算法的伪随机。现在广泛使用的是一种称作线性同余的算法,我向对于它的数学原理楼主你是不关心的,我来通俗的描述一下它的效果。 不可否认存在某一组数具有比较好的随机性(是伪随机),假设拿100亿个随机性数据比较好的数据放在一起,组成一个圆圈,那么我们需要使用随机数的时候,就\\\"随便\\\"找圈上的某个位置开始一直取数,就会得到一组伪随机数了。计算机中自然不会存储这么大的一个随机圈圈的,但是可以达到同样的效果。它的方法是这样的,是圈圈中的前一个数经过一定算法运算可以得到后面的数。先随便给定一个开始值(注意这里的“随便”),称为种子,那么用某算法对种子进行运算,得到一个结果,这个结果作为需要的随机数输出,同时将这个输出作为新的种子进行运算,得到生生不息的随机数。算法一般是确定的,也就是说,给定了一个确定的种子,那么以后的随机序列也就确定下来了------在计算机中,确实也是这样的。 前面讲到一个需要注意的“随便”,怎么去“随便”才能设置一个不确定的种子呢?怎么才能从一个大圈圈上“随便”找到一个入口呢?其实很简单,现在广泛使用的方法是使用系统的当前时间,这是一个时刻改变的值,程序运行时不能保证这个数的具体值,因此可以作为一个“随便”的入口------在计算机中,常用的随机算法都是这样的,使用时间做第一个种子。 “随机”后电脑到底对文件做了什么?怎么做的? 歌曲的随机在有了一个随机数算法以后也就简单了,至于随机有无重复这就是播放器设计者的事情了,设计是允许重复,那么就会可能有重复,不允许就没有,这是作者自定义的。播放器是一个程序,首先它有一个列表,被认为是有序的。现在楼主在考虑怎么用随机打乱它,我来说一下。 如果可以有重复,那么最简单了,每次要播放的时候产生一个随机数N,然后选择列表中的第N首歌曲播放就是了。播放完了再按相同的方法重新选择一首,无需考虑选择到已经播放过的歌曲,因为重复是被允许的。 如果不可以重复,那么可以产生一个不重复的随机序列一次播放。不重复的随机序列怎么产生?答案是一个一个产生,然后与前面产生过的做对比,出现过的直接抛弃。我还有一个更容易接受的算法,为每一个算法安排一个随机数标志,然后按照这个标志的大小对列表进行排序就可以了。这么做有一个小小的瑕疵,如果需要深入研究可以和我讨论。 播放器想要播放那个文件,那么它就可以播放那个文件。因此随机播放的时候不需要对文件做任何动作,只需要吧播放器的播放列表调整一下就可以了

转自:http://blog.sina.com.cn/s/blog_6828803d0100iol8.html

标签:

提交需求或反馈

Demand feedback