好的,所以我知道要生成一个随机数,我会创建一个这样的方法:
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数字并将其放入但无效。
答案 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();