2012-04-05 93 views
0

我正在尝试为我的一个音频程序编写一个测试,而且我在绕测试设置时遇到了麻烦。首先,我有一张60行×10000列的表格,需要填写。每个单元格的值都是ON,OFF或LEFT(这意味着我的左值与我最近的ON/OFF值相同)。我想在任何时候随机选择二十到四十行。每个人都必须打开6至200个随机单元。设置ON或OFF的命令必须按行然后按列排序。我用一个坐标键和开/关值来描绘出一个稀疏的字典。我不明白的是如何存储我的ON/OFF单元格,以便我可以轻松确定当前行是打开还是关闭。帮帮我?谢谢你的时间。创建一个随机(甘特图)图

回答

0

经过对此的进一步思考,我意识到我可以通过两遍。这就是我最终的结果。欢迎对此方法发表评论:

 var table = new byte[60, 10000]; 
     for(int i = 0; i < 60; i++) 
     { 
      // we want at least half the row to be blank 
      int j = 0; 
      while(j < 10000) 
      { 
       var width = rand.Next(7, 200); 
       j += width * 2; 
       var vol = (byte)rand.Next(50, 125); 
       for(int k = j - width; k < Math.Min(10000, j); k++) 
        table[i, k] = vol; 
      } 
     } 

     var midiEvents = new List<BASS_MIDI_EVENT>(); 
     midiEvents.Add(new BASS_MIDI_EVENT(BASSMIDIEvent.MIDI_EVENT_PROGRAM, 0, 0, 0, 0)); 

     for(int j = 0; j < 10000; j++) 
     { 
      for(int i = 0; i < 60; i++) 
      { 
       var cur = (int)table[i, j]; 
       var left = j > 0 ? table[i, j - 1] : 0; 
       if(cur > 0 && left == 0) 
       { 
        cur <<= 8; 
        cur |= i + 33; 
        midiEvents.Add(new BASS_MIDI_EVENT(BASSMIDIEvent.MIDI_EVENT_NOTE, cur, 0, j, 0)); 
       } 
       else if(cur == 0 && left > 0) 
       { 
        midiEvents.Add(new BASS_MIDI_EVENT(BASSMIDIEvent.MIDI_EVENT_NOTE, i + 33, 0, j, 0)); 
       } 
      } 
     }