创建随机(甘特图)图表

本文关键字:图表 随机 创建 | 更新日期: 2023-09-27 18:29:59

我正试图为我的一个音频程序编写一个测试,但我的大脑很难理解这个测试设置。首先,我有一个由60行乘10000列组成的表,需要填充。每个单元格都有一个值ON、OFF或LEFT(意味着我的值与离我左边最近的ON/OFF相同)。我想在任何给定的时间随机排列二十到四十排。对于随机的6到200个单元,每个单元都必须打开。设置ON或OFF的命令必须按行然后按列排序。我想象着一本稀疏字典,里面有一个坐标键和开/关值。我不明白的是如何存储我的开/关单元格,这样我就可以很容易地确定我的当前行是开还是关。帮助?谢谢你抽出时间。

创建随机(甘特图)图表

经过进一步思考,我意识到我可以分两次完成。这就是我的结局。欢迎对这种方法发表评论:

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