私が理解しているように、Random.Next()はシードを取得するためにシステム時間を使用しますが、ループを非常に高速に繰り返す場合、システム時間は変更されていないか、ほとんど変更されていないため、同じ「乱数」が得られます。ランダムを使用して開始位置を選択し、音楽ファイルへの静的な約2秒間のバイトの書き込みを開始しようとしています。30の異なる位置が選択されていますが、ほとんど同じです。私は最初からほぼ継続的に静的になり、わずか数秒間で約3回壊れてから、約30秒で通常の音楽の再生を再開します。これは私が望んでいることではありません。クリップ全体に広げる必要があります。「intpos」が問題であり、ランダムではありません。各開始位置は他のすべての位置とほぼ同じであるため、静的な量が長くなります。静的ではなく、音楽全体にランダムに広がります。私のランダムも静的です。
FileStream stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite);
for (int i = 0; i < 20; i++)
{
int pos = rand2.Next(75000, 4000000 /*I've been too lazy to get the file length, so I'm using 4000000*/ );
for (int x = 0; x < 500000/*500000 is a little over 2 seconds of static*/; x++)
{
byte number = array[rand.Next(array.Length)];
stream.Position = pos;
pos++;
stream.WriteByte(number);
}
}
(遅いCPUで)各書き込みを行うのに5秒ほどかかると想定しました。これは、次のランダムが前の位置と同じではない、または非常に近い位置を与えるのに十分な時間です。現状では、毎回約90000(音楽の最初の数秒)の初期位置を取得しているようです。次のものはすべてそれから20秒以内です。だから私の質問は、私の望ましい結果を達成するために、私は何を変更/異なる方法で行う必要があるのかということです。一緒にクラスター化するのではなく、クリップ全体に数秒間静的に分散させたいです。
ランダムに選択された16進数を格納するバイト配列がありますが、これは正常に機能しているように見えます。書き込み位置のランダム性はまったくランダムではなく、すべて非常に近接しています。
byte[] array = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F };
ありがとう。
PS FileStreamにブロックを使用する必要があることはわかっていますが、それに近づいたら追加します。