0

私が理解しているように、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にブロックを使用する必要があることはわかっていますが、それに近づいたら追加します。

4

4 に答える 4

2

500000バイトが約2秒のオーディオであり、75000〜4000000のどこかで開始している場合、曲の開始は0.15〜8秒です。これが、曲の約10秒後に静音が聞こえない理由を説明しています。randの上限として実際のファイルサイズ(マイナス500000)を使用してみてください。次の呼び出しは、を設定するために使用されposます。

于 2012-07-25T04:32:21.020 に答える
2

次のように記述した場合:int pos = rand2.Next(75000、4000000)ファイルがステレオ16ビット48KHzの場合、4000000 /(2 * 2 * 48000)=20秒のサウンド。ファイルサイズを使用すると、簡単です。怠けてはいけません:-)。
ただし、ノイズを「追加」する場合は、ファイル値を置き換えるのではなく、ランダムな値を追加する必要があります。
そして、なぜノイズ振幅がわずか16 /バイトなのですか?と固定?number = rand.Next(Amplitude)を使用すると、追加されたノイズを計算するのに問題がないように見えます。
また、各チャネルに1つずつ、合計2つのホワイトノイズを作成していることにも注意してください。

于 2012-07-25T04:40:35.823 に答える
0

乱数を生成するときに同じ問題が発生しました。同じ値を生成していました。次の簡単なコードで私の問題は解決しました。

private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public int RandomNumber(int min, int max)
{
   lock (syncLock)
   { // synchronize
       return random.Next(min, max);
   }
}

使用するものは次のとおりです。

int rn = RandomNumber(0, 10); //for example
于 2012-07-25T04:30:41.473 に答える
0

まず、Random.Nextは、システムクロックを使用して乱数を生成しません。乱数は提供されたシードに基づいて生成され、デフォルトのコンストラクター(パラメーターなし)はシステムクロックをシードとして使用しますが、システムクロックをシードとして設定するだけです。私が間違っている場合は訂正してください。乱数を取得しているように見えますが、これらの数値はほぼ同じ音を生成するのに十分に近く、大きなマージン(連続する乱数間の差)で数値を分散させたいと考えています。これを実現するには、最小しきい値を使用することをお勧めします。連続する数値の差がしきい値よりも小さい場合は、次の数値を生成するか、しきい値を満たすように値を調整してください。コードは私が言いたいことをよりよく説明することができます。

int RandomNumber(Random rand,int? lastRandomNumber, int min, int max, int threshold)
        {
            var number = rand.Next(min, max);
            if (lastRandomNumber.HasValue && Math.Abs(lastRandomNumber.Value - number) < threshold)
            {
                Console.WriteLine("Actual:{0}", number);
                if (lastRandomNumber.Value < number)
                {
                    number += threshold;
                    if (number > max)
                        number = max;
                }
                else
                {
                    number -= threshold;
                    if (number < min)
                        number = min;

                }
            }
            return number;
        }
于 2012-07-25T04:47:11.180 に答える