static Dictionary<string,Backup> getData()
{
Dictionary<string, Backup> bDict = new Dictionary<string, Backup>();
StreamReader reader = new StreamReader("/data/storedata.txt");
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
string[] parts = line.Split(' ');
string item = parts[0];
string owner = parts[1];
Random rnd = new Random();
int test = rnd.Next(item.Length+10000);//For every 'item' a Random number is generated.(the +10000 is simply to produce a 4-digit number)
//Console.WriteLine(test);//Testing
Backup BP = new Backup(item, owner,test);
bDict.Add(test.ToString(), BP);//Adding to the Dictionary.
//Console.WriteLine(string.Format("{0}, {1}, {2}", item, test, owner));
}
return bDict;
}//Read file, Grabed data and stored it in a List.
我正在/尝试做的是进行一种检查,如果两个数字相同,则生成一个新数字作为替换(或者做同样事情的其他方式)。我试过if语句,但VS一直在问我是否打算与其他东西进行比较。我在Stackoverflow上查看过这些内容,但答案与我的代码所发生的情况不符。 任何帮助表示赞赏。
FAQ datafile将有超过500个'项目' 没有最小/最大
欢呼答案 0 :(得分:5)
我生成的随机数加倍,导致我的程序崩溃。
你必须重复使用相同的随机实例,所以在循环之外创建它,否则它会同时播种,导致相同的数字。
MSDN:
随机数生成从种子值开始。如果相同 重复使用种子,生成相同的数字序列。
除此之外,您还必须检查Dictionary
中是否已存在该号码:
Random rnd = new Random();
while (!reader.EndOfStream)
// ...
while(bDict.ContainsKey(test.ToString()))
test = rnd.Next(item.Length + 10000);
答案 1 :(得分:4)
首先,您需要将Random
对象初始化移到 while
循环之外。
Random rnd = new Random();
while (!reader.EndOfStream)....
http://msdn.microsoft.com/en-us/library/system.random.aspx
随机数生成从种子值开始。如果重复使用相同的种子,则生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而与每个新的Random实例产生不同的序列。默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值
这基本上意味着:启动过快(即某种类型的loop
),你可能会获得相同的价值。
答案 2 :(得分:2)
在while循环之外实例化rnd
。然后你会给随机数机会正确行事。你正在做的是使发电机重新初始化;破坏了发电机的统计特性。
但是,对于您的具体问题,我根本不会使用rnd
。原因是您不想要任何重复的随机数。绘制一个随机数,然后测试它是否已被绘制效率低,并且越来越效率低下(顺便说一句,也会破坏生成器的统计属性:尽管预期的平均值仍然是正确的,预期方差将增加超过1/12,更高的时刻将是不正确的)。
如果你真的不需要你的序列特别随机(即不关心平均值的期望值是0.5等)那么你可以开发一个函数来交换井中整数的各个位 - 定义的方式。使用该函数的输出作为序列输入连续数字。