Php/MySQL随机数据(音高)序列


Php/MySQL random data (musical pitch) sequences

因为我是一个音乐迷(但只是一个初级编码员),所以我制作了这个脚本来随机选择一些音高(从MySQL表中)(以帮助非正式的串行风格构图)。它给出了9-12个不重复的音高名称,每组3-4个音高。例如:C、Eb、Gb (break) A、D、F、Db (break) Ab、G、b

1)是否有更有效的方法来达到预期的结果?代码看起来很麻烦。我只是让它通过一系列if-else语句。2)正如代码开头的注释所示,各种分布的概率是不等的。在实践中,这很好,但如果有其他选择就更好了。

谢谢。

<?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--;
        }
    }
}

?>

由于可能的分布是有限的,已知的,并且不是很多,因此您可以创建它们的散列查找,从中随机选择一个。这段代码未经测试,但原则上应该可以工作:

$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;

相信我,我见过更糟糕的代码,但是您可以使用一个函数来获取$ numtt的值并返回适当的结果,或者如果您熟悉面向对象编程,请考虑策略设计模式。

你们有吉他课吗?:)