我正在使用一种方法来创建两个int具有随机数的新数组,但这两个数组包含完全相同的数字.为什么会这样?
static void Main(string[] args)
{
int[] Foo1= Foo(1000);
int[] Foo2= Foo(1000);
}
static int[] Foo(int length)
{
int[] Array = new int[length];
Random r = new Random();
for (int i = 0; i < length; i++)
{
Array[i]=r.Next(1, 101);
}
//Thread.Sleep(6);
return Array;
}
Run Code Online (Sandbox Code Playgroud) 我使用该方法生成唯一的数字,但我总是得到相同的数字-2147483648.即使我停止程序,重新编译它并再次运行我仍然看到相同的数字.
public static int GetRandomInt(int length)
{
var min = Math.Pow(10, length - 1);
var max = Math.Pow(10, length) - 1;
var random = new Random();
return random.Next((int)min, (int)max);
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
随机数生成器不按我计划的方式工作(C#)
我创建了一个方法,返回一个随机数:
public static int SelectRandomMachine(int max)
{
int seed = (int)DateTime.Now.Ticks;
Random rndNumber = new Random(seed);
int randMachine = rndNumber.Next(0, max);
return randMachine;
}
Run Code Online (Sandbox Code Playgroud)
如果我两次调用该方法,目前它返回相同的随机数:
randM1 = SelectRandomMachine(maxNumber);
randM2 = SelectRandomMachine(maxNumber);
Run Code Online (Sandbox Code Playgroud)
任何建议都将受到高度赞赏.
可能重复:
随机数生成器不按我计划的方式工作(C#)
我在基本的C#编程方面经验丰富,目前正在制作Die roller.此应用程序最多可以掷四个骰子.我遇到的问题是骰子总能产生相同的结果.我使用一种方法,其中随机数生成器生成一到六的数字,然后选择适当的图片.我为每个图像框重复下面的方法,因为允许用户输入他们想要掷骰子的数量.我的问题是骰子每次都会生成相同的图片.我究竟做错了什么?
public Image displaypic(PictureBox box)
{
string picchoice;
int number;
Image picture = box.Image;
//Prevents Redundant Images
Image displaying = box.Image;
do
{
//picks a die to display
Random rand = new Random();
number = rand.Next(1, 7);
picchoice = number.ToString();
//select an image from the image selection method
picture = diepic(picture, picchoice);
}
while (picture == displaying);
//return image
return picture;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个随机生成的单词串,除非我连续多次调用它,否则它可以正常工作.这是在WebForms页面上,单词列表来自文件.
我怀疑我不理解C#中的某些东西,或者在这种情况下ASP.NET可能工作,有人可以解释为什么会发生这种情况以及如何解决问题吗?
这是方法
public string GeneratePhrase()
{
// get dictionary file
var data = File.ReadAllLines(HttpContext.Current.Server.MapPath("~/libs/words.txt"));
Random rand = new Random();
int r1 = rand.Next(data.Count());
int r2 = rand.Next(data.Count());
int r3 = rand.Next(data.Count());
string p1 = data.ElementAt(r1).ToLower();
string p2 = data.ElementAt(r2).ToLower();
string p3 = data.ElementAt(r3).ToLower();
string ret = string.Format("{0}{1}{2}", p1, p2, p3);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
如果我在a期间调用一次PostBack,那就很好并且总是创建一个随机的单词组合.但是如果我在PostBack期间多次使用它,它只是从每次调用重复相同的随机字符串.
string s1 = this.GeneratePhrase();
string s2 = this.GeneratePhrase();
string s3 = this.GeneratePhrase();
Response.Write(s1);
Response.Write(s2);
Response.Write(s3);
Run Code Online (Sandbox Code Playgroud)
产量
tirefriendhotdog
tirefriendhotdog
tirefriendhotdog
Run Code Online (Sandbox Code Playgroud)
为何会出现这种情况的原因?
我刚刚在网上通过了这篇文章:
C# Corner和C# Corner及其文章(一位拥有13年以上经验的软件开发人员)推荐使用System.Random如下:
private int RandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max);
}
Run Code Online (Sandbox Code Playgroud)
那不是每次都会给他相同的号码吗?
编辑:
所以我的问题将变成:随机如何选择它的种子?常数或当前时间值?
谢谢
我最近在这里回答了一个问题,该问题由成员@dtb编辑.
问题涉及使用Random() - 并且该成员编辑了我的答案以避免这种常见的陷阱(正如他所说)
我的原始代码不容易孤立地受到这个问题的影响,如下所示:
public void DoStuff()
{
var rand = new Random();
while() {} //Inner loop that uses 'rand'
}
Run Code Online (Sandbox Code Playgroud)
答案是编辑的,因为看起来意图是在循环中调用函数 - 这会使代码易受攻击 - 它本质上被改为:
public void DoStuff(Random R)
{
while() {} //Inner loop that uses 'rand'
}
Run Code Online (Sandbox Code Playgroud)
我的直接想法是 - 这只是将Random实例的负担推到了堆栈中 - 如果有问题的程序员不理解它是如何实现的,那么它们仍然会陷入这个陷阱.
我想我的问题是 - 为什么.Net中的Random()实现的方式与Javascript相同 - 例如 - 使用一个静态的全局Random()(比如,每个AppDomain?)?当然,在需要控制种子的极少数情况下,您仍然可以提供更多使用当前时间作为种子的显式重载/方法.
当然,这将避免这种非常常见的陷阱.任何人都可以启发我关于.Net方法的好处吗?
编辑:我理解控制种子很重要 - 但是,默认情况下执行此操作似乎是一个奇怪的选择.如果有人想控制种子,他们很可能知道他们在做什么.
干杯.
//创建一个由十行组成的字符串数组.string [] personalNumbers; //将personalNumbers声明为10元素数组personalNumbers = new string [10]; // = {"第一个数字","第二个数字","第三行"等}
for (int i = 0; i < 9; i++) // populate the array with 10 random values
{
Random random = new Random();
int randomNumber = random.Next(1, 50);
string RandomNumberText = Convert.ToString(randomNumber);
personalNumbers[i] = RandomNumberText;
}
Run Code Online (Sandbox Code Playgroud)
嗨,我知道这个SEEMS是先前提出的问题的副本,但我试图生成1到50之间的一系列随机数来填充数组
问题是,如果我按照课堂上的教学方式进行,每个数字都是一样的
我知道问题是紧密循环导致随机播种的数字相同
然而,其他线程没有解决的问题是如何在使用循环迭代时修复此问题....
迄今为止所有的解释都超出了我们的水平,我(以及其他的问题BTW)不知道如何将它们作为一种解决方案实现,我也无法在课堂上提交,因为它们是我们尚未涉及的技术
微软的教程坚持认为将随机内置于循环中是正确的解决方案
我已经尝试在循环外部放置一个随机实例,然后从循环内部调用它,但这导致了异常
是否有一种直接的方法来使用随机创建一系列不会遇到此问题的随机数?
我正在自动化一个应用程序,可以在指定的日期范围之间打开记录.我知道我可以创建一个随机选择数组中数字的数组,例如:
DateTime.Now.AddDays(90).ToString("MM/dd/yyyy")
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有更好的方法来解决这个问题.请帮忙!谢谢.
我有一个方法可以随机生成字母数字组合.如果我在循环中调用它,它将返回相同的组合,但如果我放置一个断点GetVoucherNumber并逐步执行它,则每次都会生成一个不同的数字.你能解释一下为什么会这样,以及如何避免它?
码:
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
Console.WriteLine(GetVoucherNumber(6));
Console.ReadLine();
}
public static string GetVoucherNumber(int length)
{
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var random = new Random();
var result = new string(
Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)])
.ToArray());
return result;
}
Run Code Online (Sandbox Code Playgroud)