Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C随机数创建_C# - Fatal编程技术网

C# C随机数创建

C# C随机数创建,c#,C#,好的,我知道生成一个随机数会创建一个如下的方法: private int RandomNumber(int min, int max) { Random random = new Random(); return random.Next(min, max); } 现在让我们以两个数字为例: RandomNumber(4, 25); 我希望它使最大值成为一个将要确定的值,例如: RandomNumber(0, Alist.Count); 有没有办法做到这一点?我试着让AList.Count=

好的,我知道生成一个随机数会创建一个如下的方法:

private int RandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max);
}
现在让我们以两个数字为例:

RandomNumber(4, 25);
我希望它使最大值成为一个将要确定的值,例如:

RandomNumber(0, Alist.Count);
有没有办法做到这一点?我试着让AList.Count=另一个整数,然后把它放进去,但没有用

是的,随机数字0,列表。计数会很好地工作。但是,不应为此创建函数,而应使用Random的一个实例:

编辑:所以你想从列表中选择一个随机元素

Random r = new Random();
Alist[r.Next(0, Alist.Count)] // There's your random element.

不,您不会创建这样的方法。考虑:

int num1 = RandomNumber(1, 6);
int num2 = RandomNumber(1, 6);
几乎在所有情况下,这两个变量的值都是相同的。如果您创建的随机实例在时间上过于接近,它们将从相同的时钟滴答声中获得种子,并最终为您提供相同的数字序列

无论如何,在方法调用中可以很好地使用Alist.Count,但不能为其分配数字。您必须将项目添加到列表中才能更改Count属性:

List<int> Alist = new List<int> { 1, 2, 3 };
int index = RandomNumber(0, Alist.Count);

给你,这个应该可以。这将获取您的列表并按随机顺序进行排序:


list=list.OrderBy itm=>Guid.NewGuid.ToList

根据minitech的回答中的评论,我想我应该给出自己的想法,从列表中返回随机索引——可以随意选择,也可以不选择

就我个人而言,我会声明一种扩展方法,用于使用

如果不能接受重新排序,并且我想要一个唯一索引的随机列表,我将使用:

List<int> indexes = Enumerable.Range(0, Alist.Count).ToList().Shuffle(new Random());

这是一种非常通用的扩展方法,也许值得添加到一个人的武库中。

这并不是随机数生成器应该如何使用的。您试图生成这些数字的目的是什么?要从列表中随机选择一个数字,有没有更简单的方法?您可能希望在方法之外创建随机实例,或者在静态字段中保存一个实例。看看当您快速连续地使用相同的值重复调用方法时会发生什么。你的随机数需要多大的随机性?如果你需要更多的随机性,有更好的伪随机数生成器,这和你现有的有什么不同?RandomNumber0,Alist.Count将返回一个大于或等于0且小于Alist当前大小的随机数。您得到的错误是什么。最好使用list.Sort。如果我还想确保生成的每个随机数都是唯一的,该怎么办?@Emerica.:有几种方法可以做到这一点。如果不再需要列表,最简单的方法之一是执行Alist.Sortx=>r.Next;你有一个随机列表;现在只需读取顶部,然后移除顶部。我最后做的是创建一个列表,并使用while循环将数字存储在其中,以确保新创建的值不在列表中。然后,我将列表用于它的用途,清除它并重用相同的过程。这是一种糟糕的方法吗?@Emerica@minitech作为一个纯粹主义者,我真的不喜欢看到do{generate_random_number}同时!随机数是唯一循环。我主要关心的是时间的复杂性。当然,对于小列表来说没问题,但对于中列表来说,在我的计算机上1000个元素~=33毫秒的速度有点慢,而对于大列表来说,实际上10万个元素的停顿需要4分钟以上。与a相比,a只需要10毫秒左右就可以实现同样的效果。@minitech:出于好奇,我对它进行了一次快速测试,而List.Sortx,y=>r.Next-1,2没有对我的几个测试用例抛出,List.Sortx,y=>-1立即抛出。所以用随机比较进行排序就像一颗等待引爆的定时炸弹。。。我不建议使用它;。
public static class ListExtensions
{
    public static List<T> Shuffle<T>(this List<T> list, Random random)
    {
        if (list == null) throw new ArgumentNullException("list");
        if (random == null) throw new ArgumentNullException("random");
        for (int i = list.Count - 1; i >= 1; i--)
        {
            int j = random.Next(0, i + 1);
            T temp = list[i];
            list[i] = list[j];
            list[j] = temp;
        }
        return list; // best made a void method, but for examples I'll return list.
    }
}
Alist.Shuffle(new Random());
List<int> indexes = Enumerable.Range(0, Alist.Count).ToList().Shuffle(new Random());
var shuffledList = Alist.ToList().Shuffle(new Random());