C#向节目中添加大量声音并随机选择一个播放的最佳方法?

C#向节目中添加大量声音并随机选择一个播放的最佳方法?,c#,C#,我正在尝试让一个语音线/声音在表单显示上播放,但是我只能播放两种不同的声音,我希望能够有一个列表,在每次表单显示时随机播放,有人知道最好的方法吗?以下是我现在掌握的代码: if (Properties.Settings.Default.UI > 0) { var random = new Random(); SoundPlayer audio = new SoundPlayer(_2B.Properti

我正在尝试让一个语音线/声音在表单显示上播放,但是我只能播放两种不同的声音,我希望能够有一个列表,在每次表单显示时随机播放,有人知道最好的方法吗?以下是我现在掌握的代码:

            if (Properties.Settings.Default.UI > 0)
        {
            var random = new Random();
            SoundPlayer audio = new SoundPlayer(_2B.Properties.Resources.russian);
            audio.Play();
        }
        else
        {
            SoundPlayer audio = new SoundPlayer(_2B.Properties.Resources.freedom);
            audio.Play();
        }
我尝试为随机选取添加一个var,但它不起作用,我假设我可以做与此相同的事情:

                if (settings.version < newversionparsed) 
            {
                bunifuCircleProgressbar1.Value +=1;
                var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
                var stringChars = new char[8];
                var random = new Random();
                for (int i = 0; i < stringChars.Length; i++)
                {
                    stringChars[i] = chars[random.Next(chars.Length)];
                }
                var finalString = new String(stringChars);
if(settings.version

但是我不太确定它是否像我想的那样工作,我也不知道这是否可行。

在某个地方创建一个
Random
的实例,最好是静态的,这样你就可以轻松地重用同一个实例:

static Random random = new Random();
创建一个包含您想要的所有声音的数组:

string[] Stream = new Stream[] {
    _2B.Properties.Resources.russian,
    _2B.Properties.Resources.freedom
    // Add as many sounds as you want
};
然后,当您想要播放声音时:

string sound = sounds[random.Next(sounds.Length)];
SoundPlayer audio = new SoundPlayer(sound);

保持你的
随机
,这样你会得到一个合理的结果

在.NET Framework上,在紧循环或快速连续初始化两个随机数生成器会创建两个随机数生成器,它们可以生成相同的随机数序列。在大多数情况下,这不是开发人员的意图,可能会导致性能问题,因为实例化和初始化随机数生成器r是一个相对昂贵的过程

为了提高性能并避免无意中创建单独的随机数生成器以生成相同的数字序列,我们建议您创建一个随机对象以随时间生成多个随机数,而不是创建新的随机对象以生成一个随机数

因此,创建一个并多次使用它会更好。 注意:
Random
不是线程安全的,但有一个线程安全版本的示例

下面是一个例子

public static void Main()
{
    Console.WriteLine("Hello World");
    int len = 10;
    int seed = 7;
    string newEverytime = "";
    for( int i =0 ; i < len; i++){
        newEverytime+= new Random().Next( seed ).ToString();
    }
    Console.WriteLine( newEverytime ); // print something fixed
    string get10Next="";
    Random r = new Random();
    for( int i =0 ; i < len; i++){
        get10Next+=r.Next(seed);
    }
    Console.WriteLine( get10Next );  // print random string
}

不要每次都使用新的
Random
。继续使用同一个。你可以尝试10个
new Random()。下一个
和一个
Random
使用10次
Next
。那么我应该拿出新的吗?让它成为
var Random=Random()
然而,如果我这样做,它会出错。我主要是想让随机声音为代码的顶部工作,底部是为我项目中的另一部分工作,这很好,但我想看看我是否可以使用相同的概念,但对于声音。我试图理解,但我不认为我是,你的意思是这样的吗?`如果(Properties.Settings.Default.UI>0){new Random().Next();SoundPlayer audio=new SoundPlayer(_2B.Properties.Resources.俄语);SoundPlayer audio=new SoundPlayer(_2B.Properties.Resources.byebye);audio.Play();}“正如你所看到的,我甚至不知道如何存储多个声音,因为我想为不同的值选择不同的声音,我不知道没有嵌入的是什么。我发布了一个答案作为示例。我想这可能是我要寻找的答案,但我应该将字符串放在哪里?当我将其复制到其中时,会出现属性和错误如果我手动输入,我不能有一个以上的声音没有错误:/对不起,我有点聪明呵呵,我把它放在这里,我想我可以把它放在下面,但是idk,我试图让一个随机的声音播放几乎像表单显示的那样。我可以用两个声音来播放,但我不能添加额外的声音或随机。我感觉我在这里很笨,实际上很简单,但我只是迷路了。@Russianfkr是
\u 2B.Properties.Resources.俄语
a
Stream
而不是
string
?尝试将
string[]
数组更改为
Stream[]
(例如
Stream[]sounds=new Stream[]
)。同时,您还缺少结束的
}
变量列表中的大括号。Ooo切换成功!最后一件事是对的。现在,它是随机的,我仍然希望它是一种更为有序的随机类型,所以我基本上制作了一个UI声音,它介于男性和女性之间,所以我喜欢播放的音频是从第一个表单(登录)中选择的男性或女性,如图所示:当下一个论坛出现一个随机声音,但从该值播放。这可能吗?@Russianfkr如果我理解正确的话,只需发出两组声音,一男一女。
class Foo{
    Random rnd = new Random();

    void PlaySound(){
        int val = rnd.Next( 1 ); // use a seed you like
        // implement your play sound
    }
}