打印

MP3里的歌曲是如何随机播放的?~~~求解释!

[复制链接]
3763|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wdwd321|  楼主 | 2013-4-14 21:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
tyw| | 2013-4-14 21:06 | 只看该作者

使用特权

评论回复
板凳
gkb986| | 2013-4-14 21:18 | 只看该作者
呵呵,参考随机数产生函数

使用特权

评论回复
地板
wdwd321|  楼主 | 2013-4-14 21:20 | 只看该作者
gkb986 发表于 2013-4-14 21:18
呵呵,参考随机数产生函数

随机数看过的,需要种子。MP3里的随机数种子是如何选择的?谢谢!

使用特权

评论回复
5
dirtwillfly| | 2013-4-14 21:45 | 只看该作者
wdwd321 发表于 2013-4-14 21:20
随机数看过的,需要种子。MP3里的随机数种子是如何选择的?谢谢!

随机数需要种子?我孤陋寡闻了,这个种子做啥用?
我觉得用个随机数产生函数随机生产一个整数,对总歌曲数量取模就行。

使用特权

评论回复
6
wdwd321|  楼主 | 2013-4-14 21:48 | 只看该作者
dirtwillfly 发表于 2013-4-14 21:45
随机数需要种子?我孤陋寡闻了,这个种子做啥用?
我觉得用个随机数产生函数随机生产一个整数,对总歌曲 ...

我也是一知半解。随机数产生函数随机生产一个整数?这是哪个算法?
我知道srand()he rand()两个函数

使用特权

评论回复
7
dirtwillfly| | 2013-4-14 21:48 | 只看该作者
wdwd321 发表于 2013-4-14 21:20
随机数看过的,需要种子。MP3里的随机数种子是如何选择的?谢谢!

刚看了一下种子,明白了。也可以用系统时间做种子。
其实用伪随机数就好,没人那么较真的

使用特权

评论回复
8
wdwd321|  楼主 | 2013-4-14 21:50 | 只看该作者
dirtwillfly 发表于 2013-4-14 21:48
刚看了一下种子,明白了。也可以用系统时间做种子。
其实用伪随机数就好,没人那么较真的 ...

单片机上貌似不能用系统时间的~~所以才来请教!

使用特权

评论回复
9
dirtwillfly| | 2013-4-14 21:53 | 只看该作者
wdwd321 发表于 2013-4-14 21:50
单片机上貌似不能用系统时间的~~所以才来请教!

:LMP3一般都是带时间显示的吧?你就取这个时间做参数就好

使用特权

评论回复
10
wdwd321|  楼主 | 2013-4-14 22:02 | 只看该作者
dirtwillfly 发表于 2013-4-14 21:53
MP3一般都是带时间显示的吧?你就取这个时间做参数就好

参数不好取。得好好琢磨琢磨,我不做MP3。。。想做一个语音随机控制

使用特权

评论回复
11
dirtwillfly| | 2013-4-14 22:09 | 只看该作者
wdwd321 发表于 2013-4-14 22:02
参数不好取。得好好琢磨琢磨,我不做MP3。。。想做一个语音随机控制

我建议还是用个伪随机函数就好,没有多少人会分析你产品里的程序具体算法的。除非想山寨你产品的人

使用特权

评论回复
12
wdwd321|  楼主 | 2013-4-14 22:12 | 只看该作者
dirtwillfly 发表于 2013-4-14 22:09
我建议还是用个伪随机函数就好,没有多少人会分析你产品里的程序具体算法的。除非想山寨你产品的人 ...

用一个变量的地址如何?产生的随机数相对多一些!

使用特权

评论回复
13
dirtwillfly| | 2013-4-14 22:19 | 只看该作者
wdwd321 发表于 2013-4-14 22:12
用一个变量的地址如何?产生的随机数相对多一些!

:L变量的地址最多会在一个范围内变动,而且这个貌似不是随机的。你可以先观察下看看。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
wdwd321 + 3
14
wdwd321|  楼主 | 2013-4-14 23:13 | 只看该作者
dirtwillfly 发表于 2013-4-14 22:19
变量的地址最多会在一个范围内变动,而且这个貌似不是随机的。你可以先观察下看看。 ...

额。好的~~~:D

使用特权

评论回复
15
老老实实| | 2013-4-14 23:17 | 只看该作者
我们常用的方法就是读一下定时器的值,按照一定的算法.就得到一个随机数.直接去播就好了

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
wdwd321 + 3
16
dirtwillfly| | 2013-4-15 08:04 | 只看该作者
老老实实 发表于 2013-4-14 23:17
我们常用的方法就是读一下定时器的值,按照一定的算法.就得到一个随机数.直接去播就好了 ...

好办法

使用特权

评论回复
17
wdwd321|  楼主 | 2013-4-15 08:56 | 只看该作者
老老实实 发表于 2013-4-14 23:17
我们常用的方法就是读一下定时器的值,按照一定的算法.就得到一个随机数.直接去播就好了 ...

这个思路值得参考~:D  

使用特权

评论回复
18
天命风流| | 2013-4-15 09:00 | 只看该作者
路过   学习了

使用特权

评论回复
19
tyw| | 2013-4-15 09:15 | 只看该作者
本帖最后由 tyw 于 2013-4-15 09:21 编辑

玛莉机开奖随机数发生子程序,供参考

;****************************************
;* 取(6FH)~(70H)范围乱数,结果在(58H)中             *
;* 乱数上限在(70H),乱数下限在(6FH)                      *
;****************************************
;
RBC:    PUSH    ACC               ;现场保护
            PUSH    B
            PUSH    PSW
            SETB    PSW.4            ;区2(10H)~(17H)
            CLR     PSW.3
RBC0:   NOP
            MOV     A,58H             ;读取由【RND】子程序产生的乱数
            CJNE    A,6FH,RBC2    ;乱数与下限比较
RBC2:   JC      RBC1               ;C=1,乱数〈下限,转RBC1重读乱数
            MOV     A,58H
            CJNE    A,70H,RBC3   ;C=0,乱数〉=下限,则再与上限比较
RBC4:   POP     PSW              ;乱数〈=上限,恢复现场
            POP     B
            POP     ACC
            RET
;
RBC3:   JC      RBC4               ;C=1,乱数〈上限 ,转RBC4结束
RBC1:   LCALL   RND              ;C=0,乱数〉上限,或乱数〈下限,重读乱数
            SJMP    RBC0              ;转RBC0重新判断
;******************************
;* 在(56H)~(59H)中产生乱数值         *
;*                   ML.09E9                       *
;******************************
;
RND:    NOP
            CLR     IE.7               ;关中断
            MOV     A,59H           ;取出乱数种子
            RRC     A                  ;右环移三次
            RRC     A
            RRC     A
            XRL     A,57H            ;与(57H)内容异或
            RRC     A                  ;右环移二次
            RRC     A
            XRL     A,58H            ;与(58)内容异或
            RRC     A                   ;右环移一次
            XRL     A,56H            ;与(56)内容异或
            RRC     A                   ;右环移一次
            CPL     C                    ;进位标志取反
            MOV     R0,#56H         ;乱数寄存器首址
            MOV     R2,#04          ;共有四位乱数
RND1:   MOV     A,@R0           ;取出乱数寄存器内容
            RLC     A                    ;左环移一次
            MOV     @R0,A           ;送回乱数寄存器
            INC     R0
            DJNZ    R2,RND1
            SETB    IE.7                ;开中断
            RET

使用特权

评论回复
20
HORSE7812| | 2013-4-15 11:15 | 只看该作者
:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

45

帖子

0

粉丝