Random.Next()不选择随机值的问题

时间:2012-07-25 04:13:29

标签: c# .net

据我了解,Random.Next()使用系统时间来获取种子,但是当非常快地遍历循环时,系统时间没有改变或几乎没有改变,给了我相同的“随机”数字。我试图使用随机选择起始位置开始写入大约2秒静态的字节到这里和音乐文件,选择30个不同的位置,但它们几乎相同。我从一开始就几乎连续静止,在它恢复正常播放音乐之前的几秒内断了大约3次;这不是我想要的,我需要它在整个剪辑中展开。 “int pos”是问题,它不是随机的,每个起始位置几乎与所有其他位置相同,所以我有一个长时间的静态,而不是静态随机传播整个音乐。我的randoms也是静态的。

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

我认为每次写入需要5秒左右(在我的慢速CPU上),这对于下一次随机给我一个与前一个不相同或非常接近的位置是足够的时间一。就目前而言,每次我的初始位置约为90000(音乐的前几秒);所有下一个都在20秒内。所以我的问题是,为了达到我想要的结果,我需要修改/做些什么?我想在整个剪辑中散布几秒静电,而不是聚集在一起。

我有一个字节数组存储我的十六进制数字,这些数字是随机选择的,看起来工作正常,只是写作位置的随机性根本不是随机的,它们都非常接近。

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

感谢。

P.S。我知道我应该使用FileStream的块,当我开始使用它时我会添加它。

4 个答案:

答案 0 :(得分:2)

如果500000字节是大约2秒的音频,并且你从75000到4000000之间的某个地方开始,那么你将在这首歌中以0.15秒到8秒之间开始。这就解释了为什么你在大约10秒后没有听到任何静音。尝试使用实际文件大小(减去500000)作为rand.Next调用的上限,用于填充pos

答案 1 :(得分:2)

当你写:     int pos = rand2.Next(75000,4000000) 如果您的文件是立体声16位48KHz,那么4000000 /(2 * 2 * 48000)= 20秒 声音。使用文件大小,很容易。你不应该懒惰:-)。
但是,如果你'添加'噪音,你不应该替换文件值,而是添加到 它是随机值。
为什么噪声幅度只有16 / Byte?并修复?使用数字= rand.Next(幅度)  计算增加的​​噪音似乎很好 另请注意,您正在创建两个白噪声,每个声道都有一个。

答案 2 :(得分: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

答案 3 :(得分: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;
        }