PHP/MySQL 随机数据(音高)序列 [英] Php/MySQL random data (musical pitch) sequences

查看:38
本文介绍了PHP/MySQL 随机数据(音高)序列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因为我是一个音乐书呆子(但只是一个初级编码员),我制作了这个脚本来随机选择一些音高(从 MySQL 表中)(以帮助非正式的连续式作曲.)它提供 9-12 不重复3-4 组音高名称,每组 3-4 个音高.例如:C, Eb, Gb (中断) A, D, F, Db (中断) Ab, G, B.

Because I am a music nerd (but only a beginning coder), I made this script to chose some pitches (from a MySQL table) at random (to help with informal serial-style composition.) It gives 9-12 nonrepeating pitch names in 3-4 sets of 3-4 pitches each. For example: C, Eb, Gb (break) A, D, F, Db (break) Ab, G, B.

1) 有没有更有效的方法来达到这个预期的结果?代码看起来很麻烦.我只是把它放在一堆 if-else 语句中.2)正如代码开头的注释所示,各种分布的概率是不等的.在实践中这很好,但最好有替代方案.

1) Is there a more efficient way to achieve this desired result? The code seems cumbersome. I just put it through a bunch of if-else statements. 2) As the comment at the beginning of the code shows, the probability of the various distributions is unequal. In practice that's fine but it would be nice to have an alternative.

谢谢.

<?php

/*
This code assigns pitch distributions to one of the following combinations. 
The first number is possible values of $numtot:
9 = 3,3,3
10 = 4,3,3; 
     3,4,3; 3,3,4
11 = 4,4,3; 4,3,4; 
     3,4,4; 
12 = 4,4,4; 
     3,3,3,3;
Note that probabilities are unequal:
eg: 3,3,3 is 2x as likely to occur as 3,3,3,3
*/

$sandbox = mysql_connect("localhost", "root", "password")
or die(mysql_error());
mysql_select_db("sandbox", $sandbox);

$numtot = rand(9,12);

$sql = "SELECT * FROM pitches ORDER BY RAND() LIMIT $numtot";
$result = mysql_query($sql, $sandbox);

echo "Your pitches are:<br>";

if ($numtot==9) {
    while ($row = mysql_fetch_array ($result)) {
    if ($numtot>7)
        {echo $row['Pitch'].", ";}
    else if ($numtot==7)
        {echo $row['Pitch']."<br>";}
    else if ($numtot>4) 
        {echo $row['Pitch'].", ";}
    else if ($numtot==4) 
        {echo $row['Pitch']."<br> ";}
    else if ($numtot>1)
        {echo $row['Pitch'].", ";}  
    else
        {echo $row['Pitch'];}
    $numtot--;
    }
}

else if ($numtot==10) {
    $num1 = rand(3,4);
    if ($num1 == 4){
        while ($row = mysql_fetch_array ($result)) {
            if ($numtot>7)
                {echo $row['Pitch'].", ";}
            else if ($numtot==7)
                {echo $row['Pitch']."<br>";}
            else if ($numtot>4) 
                {echo $row['Pitch'].", ";}
            else if ($numtot==4) 
                {echo $row['Pitch']."<br> ";}
            else if ($numtot>1)
                {echo $row['Pitch'].", ";}  
            else
                {echo $row['Pitch'];}
        $numtot--;
        }
    }
    else {
        $num2 = rand(3,4);
        if ($num2 == 4) {
            while ($row = mysql_fetch_array ($result)) {
                if ($numtot>8)
                    {echo $row['Pitch'].", ";}
                else if ($numtot==8)
                    {echo $row['Pitch']."<br>";}
                else if ($numtot>4) 
                    {echo $row['Pitch'].", ";}
                else if ($numtot==4) 
                    {echo $row['Pitch']."<br> ";}
                else if ($numtot>1)
                    {echo $row['Pitch'].", ";}  
                else
                    {echo $row['Pitch'];}
            $numtot--;
            }
        }
        else {
            while ($row = mysql_fetch_array ($result)) {
                if ($numtot>8)
                    {echo $row['Pitch'].", ";}
                else if ($numtot==8)
                    {echo $row['Pitch']."<br>";}
                else if ($numtot>5) 
                    {echo $row['Pitch'].", ";}
                else if ($numtot==5) 
                    {echo $row['Pitch']."<br> ";}
                else if ($numtot>1)
                    {echo $row['Pitch'].", ";}  
                else
                    {echo $row['Pitch'];}
            $numtot--;
            }
        }
    }
}

else if ($numtot==11) {
    $num1 = rand(3,4);
    if ($num1 == 4){
        while ($row = mysql_fetch_array ($result)) {
            if ($numtot>8)
                {echo $row['Pitch'].", ";}
            else if ($numtot==8)
                {echo $row['Pitch']."<br>";}
            else if ($numtot>4) 
                {echo $row['Pitch'].", ";}
            else if ($numtot==4) 
                {echo $row['Pitch']."<br> ";}
            else if ($numtot>1)
                {echo $row['Pitch'].", ";}  
            else
                {echo $row['Pitch'];}
        $numtot--;
        }
    }
    else {
        $num2 = rand(3,4);
        if ($num2 == 4) {
            while ($row = mysql_fetch_array ($result)) {
                if ($numtot>8)
                    {echo $row['Pitch'].", ";}
                else if ($numtot==8)
                    {echo $row['Pitch']."<br>";}
                else if ($numtot>5) 
                    {echo $row['Pitch'].", ";}
                else if ($numtot==5) 
                    {echo $row['Pitch']."<br> ";}
                else if ($numtot>1)
                    {echo $row['Pitch'].", ";}  
                else
                    {echo $row['Pitch'];}
            $numtot--;
            }
        }
        else {
            while ($row = mysql_fetch_array ($result)) {
                if ($numtot>9)
                    {echo $row['Pitch'].", ";}
                else if ($numtot==9)
                    {echo $row['Pitch']."<br>";}
                else if ($numtot>5) 
                    {echo $row['Pitch'].", ";}
                else if ($numtot==5) 
                    {echo $row['Pitch']."<br> ";}
                else if ($numtot>1)
                    {echo $row['Pitch'].", ";}  
                else
                    {echo $row['Pitch'];}
            $numtot--;
            }
        }
    }
}

else if ($numtot==12) {
    $num1 = rand(3,4);
    if ($num1 == 4){
        while ($row = mysql_fetch_array ($result)) {
            if ($numtot>9)
                {echo $row['Pitch'].", ";}
            else if ($numtot==9)
                {echo $row['Pitch']."<br>";}
            else if ($numtot>5) 
                {echo $row['Pitch'].", ";}
            else if ($numtot==5) 
                {echo $row['Pitch']."<br> ";}
            else if ($numtot>1)
                {echo $row['Pitch'].", ";}  
            else
                {echo $row['Pitch'];}
        $numtot--;
        }
    }
    else {
        while ($row = mysql_fetch_array ($result)) {
            if ($numtot>10)
                {echo $row['Pitch'].", ";}
            else if ($numtot==10)
                {echo $row['Pitch']."<br>";}
            else if ($numtot>7) 
                {echo $row['Pitch'].", ";}
            else if ($numtot==7) 
                {echo $row['Pitch']."<br> ";}
            else if ($numtot>4) 
                {echo $row['Pitch'].", ";}
            else if ($numtot==4) 
                {echo $row['Pitch']."<br> ";}                       
            else if ($numtot>1)
                {echo $row['Pitch'].", ";}  
            else
                {echo $row['Pitch'];}
            $numtot--;
        }
    }
}


?>

推荐答案

由于可能的分布是有限的、已知的,而且数量不多,您可以创建它们的哈希查找,从中您可以随机选择一个.此代码未经测试,但原则上应该可以工作:

Since the possible distributions are finite, known, and not that many, you can create a hash lookup of them, from which you can choose one at random. This code is untested, but should work in principle:

$dists = array(
    array(array(3,3,3)),
    array(array(4,3,3),array(3,4,3),array(3,3,4)),
    array(array(4,4,3),array(4,3,4),array(3,4,4)),
    array(array(4,4,4),array(3,3,3,3))
);

$sandbox = mysql_connect("localhost", "root", "password")
or die(mysql_error());
mysql_select_db("sandbox", $sandbox);

$numtot = rand(9,12);

$sql = "SELECT * FROM pitches ORDER BY RAND() LIMIT $numtot";
$result = mysql_query($sql, $sandbox);

$index = $numtot - 9;
$dist = $dists[$index][array_rand($dists[$index])];

$i = 1;
$j = 0;
$out = '';
while ($row = mysql_fetch_array ($result)) {
    $out .= $row['Pitch'];
    if ($i == $dist[$j]) {
        $out .= '<br>';
        $i = 1;
        $j++;
    } else {
        $out .= ',';
        $i++;
    }
}
echo $out;

这篇关于PHP/MySQL 随机数据(音高)序列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆