【问题标题】:Knuth Shuffle Multiple Arrays in the same wayKnuth 以相同的方式随机播放多个数组
【发布时间】:2013-10-30 20:30:07
【问题描述】:

我正在使用 knuth shuffle 来随机化一个数组。我希望能够添加另一个数组并以相同的方式随机化。之前有想过在字符串中分隔数组,比如['A|1|I,B|2|II,C|3|III,D|4|IV']

在 stackoverflow 上,我阅读了 this,但我不知道如何为 knuth shuffle 安排它。

这是我目前用来从第一个数组中获取字符串的 JS,附加代码取自上面的链接。

Array.prototype.knuthShuffle = function()
        {
            var i = this.length, j, temp;
            while ( --i )
            {
                j = Math.floor( Math.random() * (i - 1) );
                temp = this[i];
                this[i] = this[j];
                this[j] = temp;
            }
        };

var array_chromatic = ['A', 'A%23', 'Bb', 'B', 'C', 'C%23', 'Db', 'D', 'D%23', 'Eb', 'E', 'F', 'F%23', 'Gb', 'G', 'G%23', 'Ab'],
    array_chronumb = ['Aa', 'A%23a', 'Bbb', 'Bb', 'Cc', 'C%23c', 'Dbd', 'Dd', 'D%23d', 'Ebe', 'Ee', 'Ff', 'F%23f', 'Gbg', 'Gg', 'G%23g', 'Aba'];

        function renderKnuth()
        {
            array_chromatic.knuthShuffle();
      array_chronumb.knuthShuffle();

            var audio = document.getElementById('sound');
      audio.src = 'url-redacted' + array_chromatic[0] + '.mp3';
      var str1 = array_chromatic[0]
      str2 = str1.replace("%23", '#');
            document.getElementById('knuth_data2').innerHTML = str2;// + array_accidental[0];
document.getElementById('knuth_data3').innerHTML = array_chronumb[0];
        }

【问题讨论】:

    标签: javascript arrays shuffle knuth


    【解决方案1】:

    打乱单个有序数字数组,然后将该数组的打乱应用到其他数组的顺序,方法是将打乱数组的值用作其他数组的索引。

    var index_array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
    index_array.knuthShuffle();
    
    var array_chromatic_shuffled = [],
        array_chronumb_shuffled = [];
    
    for(var i=0; i<index_array.length; ++i) {
        array_chromatic_shuffled[i] = array_chromatic[index_array[i]];
        array_chronumb_shuffled[i] = array_chronumb[index_array[i]];
    }
    
    array_chromatic = array_chromatic_shuffled;
    array_chronumb = array_chronumb_shuffled;
    

    在这里,index_array 被打乱,形成用于从原始数组读取并填充打乱数组的打乱索引列表。在每次迭代中,index_array[i] 是一个混洗索引,用于从每个数组中提取一个值,并将其放在数组的相应混洗形式中的索引 i

    【讨论】:

      【解决方案2】:

      链接中的功能正是您所需要的

      function randomise(a, b)
      {
          var i = a.length, j, temp;
          while ( --i )
          {
              j = Math.floor( Math.random() * (i - 1) );
              temp = a[i];
              a[i] = a[j];
              a[j] = temp;
              temp = b[i];
              b[i] = b[j];
              b[j] = temp;
          }
      };
      
      var array_chromatic = ['A', 'A%23', 'Bb', 'B', 'C', 'C%23', 'Db', 'D', 'D%23', 'Eb', 'E', 'F', 'F%23', 'Gb', 'G', 'G%23', 'Ab'];
      var array_chronumb = ['Aa', 'A%23a', 'Bbb', 'Bb', 'Cc', 'C%23c', 'Dbd', 'Dd', 'D%23d', 'Ebe', 'Ee', 'Ff', 'F%23f', 'Gbg', 'Gg', 'G%23g', 'Aba'];
      
      randomise(array_chromatic, array_chronumb);
      

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2020-12-10
        • 1970-01-01
        • 2014-04-08
        • 2021-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多