C#随机数创建

时间:2011-12-14 01:29:53

标签: 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 =另一个int数字并将其放入但无效。

4 个答案:

答案 0 :(得分:4)

是的,RandomNumber(0, Alist.Count)将完美运作。但是,您应该使用 Random一个实例,而不是为此创建函数:

Random r = new Random();
DoSomething(r.Next(0, Alist.Count));
DoSomething(r.Next(0, Alist.Count));
DoSomething(r.Next(0, Alist.Count));
// etc., whatever you want.

编辑:所以你想要列表中的随机元素吗?

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

答案 1 :(得分:1)

根据minitech的回答中的评论,我认为我会自己从列表中返回随机索引 - 随意接受或离开它;)。

就个人而言,我会声明一个O(n)改组列表的扩展方法(使用Fisher-Yates shuffle):

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

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

答案 2 :(得分:0)

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

int num1 = RandomNumber(1, 6);
int num2 = RandomNumber(1, 6);

几乎所有时间,这两个变量最终会具有相同的值。如果您创建Random个实例的时间太近,它们将从相同的时钟滴答中获取种子,并最终为您提供相同的数字序列。


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

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

答案 3 :(得分:0)

在这里,你应该这样做。这将采用您的列表并按随机顺序对其进行排序:

list = list.OrderBy(itm =&gt; Guid.NewGuid())。ToList();