下面是我用来声明变量的代码:
Random x= new Random();
int xval;
string xresult;
xval = x.Next(4);
string[] xlist = {
"ZERO",
"ONE",
"TWO",
"THREE",
};
xresult = xlist[xval];
我的问题是,我使用它的结果是一样的。我希望每次更改或重置。
答案 0 :(得分:0)
使用它时随机使用从DateTime.Now派生的种子进行初始化 - 您使用它生成0到4之间的数字(不包括) - 所以25%的时间你会得到相同的数字:
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
Random x= new Random();
List<int> ints = new List<int>();
for(int i=0; i< 100; i++) ints.Add(x.Next(4));
Console.WriteLine(string.Join(", ",ints));
}
}
输出(重新格式化):
3, 0, 1, 1, 1, 1, 3, 0, 2, 0, 1, 2, 1, 0, 3, 1, 3, 0, 2, 2, 3, 1, 1, 2, 1,
2, 3, 3, 2, 3, 3, 2, 0, 3, 3, 3, 0, 0, 3, 0, 2, 1, 3, 3, 1, 0, 2, 1, 3, 0,
2, 2, 3, 3, 1, 1, 2, 3, 3, 2, 2, 0, 2, 2, 1, 2, 2, 1, 1, 3, 1, 3, 1, 2, 0,
2, 2, 1, 0, 1, 3, 1, 0, 1, 1, 1, 2, 0, 2, 1, 1, 0, 0, 0, 1, 2, 3, 0, 2, 2
它产生不同的。你只是不幸运。
您应该将声明Random x=new Random()
(badname btw)移到您使用它之外的地方,这样您就不会一遍又一遍地创建声明,也许会为&#34;不同的&#34;根据你的时间种子。您可以在随机(偶然)的不同种子运行中使用相同的100位数字。随机并不意味着不同,特别是如果你只使用4个值将所有随机性映射到。
评论中的评论之后 - 说明&#34;相同&#34;不同随机种子的起始序列:
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
static IEnumerable<int> FirstNumbersFromSeed(int seed, int num)
{
var r = new Random(seed);
for (int i=0;i<num;i++)
yield return r.Next(4);
}
public static void Main()
{
Dictionary<string,List<int>> dict = new Dictionary<string,List<int>>();
int num = 5;
for (int i =0;i<2000; i++)
{
var key = string.Join(",",FirstNumbersFromSeed(i,num));
if (dict.ContainsKey(key)) dict[key].Add(i);
else dict[key] = new List<int>(i);
}
foreach(var kvp in dict.Where(d => d.Value.Count > 1))
Console.WriteLine(string.Join(", ",kvp.Key) + " same first " + num + " values for seed with ints: " + string.Join(",",kvp.Value));
}
}
输出:
2,3,3,2,0 same first 5 values for seed with ints: 239,890
0,0,1,3,2 same first 5 values for seed with ints: 1463,1576
3,1,0,3,0 same first 5 values for seed with ints: 540,653,1876
1,1,1,2,1 same first 5 values for seed with ints: 656,769,895
<snipped 300 more output lines>
1,0,1,3,3 same first 5 values for seed with ints: 1862,1988
所以你有大约305次&#34;碰撞&#34;它提供相同的5个开始&#34;随机&#34;如果从0到4绘制随机值(不包括),则种子值介于0和2000之间。
答案 1 :(得分:0)
如果您只想从数组中提取随机值,请使用以下代码:
private static Random s_Random = new Random();
public static void Main(string[] args)
{
String[] xlist =
{
"ZERO",
"ONE",
"TWO",
"THREE"
};
Int32 idx;
for (Int32 i = 0; i < 10; ++i)
{
idx = s_Random.Next(xlist.Length);
Console.WriteLine(xlist[idx]);
}
}
请注意,创建唯一的Random
实例非常重要,并且每次需要随机数时都要重复使用它,以实现生成数字的一致性。
您可以尝试一个有效的演示here。