我有以下功能:
//Function to get random number
public static int RandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max);
}
Run Code Online (Sandbox Code Playgroud)
我怎么称呼它:
byte[] mac = new byte[6];
for (int x = 0; x < 6; ++x)
mac[x] = (byte)(Misc.RandomNumber((int)0xFFFF, (int)0xFFFFFF) % 256);
Run Code Online (Sandbox Code Playgroud)
如果我在运行时使用调试器执行该循环,则会得到不同的值(这就是我想要的).但是,如果我在该代码下面放置一个断点两行,则"mac"数组的所有成员都具有相同的值.
为什么会这样?
我正在做一些相当简单的事情,我认为它会是.我想要的是当点击button1我希望它禁用button1并启用button2.我得到以下错误:错误1只能将赋值,调用,递增,递减和新对象表达式用作语句.
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button3_Click(object sender, EventArgs e)
{
Close();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void RandomNumber(int min, int max)
{
int num = new Random().Next(min, max);
label1.Text = num.ToString();
}
private void button1_Click(object sender, EventArgs e)
{
RandomNumber(0,99);
button2.Enabled == true ;
if (textBox1.Text == label1.Text)
MessageBox.Show("Winner");
}
private void label1_Click(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e) …Run Code Online (Sandbox Code Playgroud) 我在c#中生成随机数问题.如果我直接运行此表单应用程序,则随机数生成对所有人来说都是相同的.
如果我通过按F10逐行调试,那么它将生成不同的随机数.为什么会这样?我该怎么做才能生成不同的随机数?
Greyhound.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ADayAtTheRaces
{
class Greyhound
{
int location=0;
Random randomize = new Random();
public int run()
{
location = randomize.Next(0, 100);
return location;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Form1.cs的
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ADayAtTheRaces
{
public partial class Form1 : Form
{
Greyhound[] greyHound = new Greyhound[4];
ProgressBar[] progressBar = new ProgressBar[4]; …Run Code Online (Sandbox Code Playgroud) 可能重复:
随机数生成器仅生成一个随机数
不久前我对此感到有些困惑.我有以下代码:
public blockType generateRandomBlock()
{
Random random = new Random();
int makeBlockOfType = random.Next(0, 100);
blockType t = blockType.normal;
if (makeBlockOfType <= 80 && makeBlockOfType >= 60)
{
t = blockType.blue;
}
else if (makeBlockOfType > 80 && makeBlockOfType <= 95)
{
t = blockType.orange;
}
else if (makeBlockOfType > 95 && makeBlockOfType <= 100)
{
t = blockType.green;
}
return t;
}
Run Code Online (Sandbox Code Playgroud)
相当简单,它enum根据随机生成的数字(基于系统时间)返回一个值.不幸的是,由于一些奇怪的原因,我有所有的块都是一种颜色或另一种颜色,即使这是针对每个被放入游戏的块运行.但是,当我使用调试器逐步执行此操作,然后在运行一段时间后查看结果时,我发现块现在根据提供的机会多色.我对为什么会发生这种情况感到有些困惑.
为此,我使用MonoGame,它使用Mono编译器而不是Microsoft编译器.这可能是问题吗?我试图将此代码内联到构造函数中,从中调用它但我得到的结果相同(我猜测编译器无论如何都会内联代码).
我试图单独重启Visual Studio而不是让运行进行构建; 没有变化.
任何建议和帮助非常感谢!
我在生成随机整数时发现了一些有趣的东西(至少对我来说),我无法向自己解释,所以我想我会在这里发布.
我的需求很简单:我正在生成随机整数(Int32)ID,旨在最大限度地减少冲突.生成时间不是问题.
我已经尝试过这些方法来生成随机整数:
1.)
return rnd.Next();
Run Code Online (Sandbox Code Playgroud)
其中rnd是Random类型的类字段,方法#3的种子.
2.)
return rnd.Next(Int32.MinValue, Int32.MaxValue);
Run Code Online (Sandbox Code Playgroud)
其中rnd是类型为Random的类字段,种子来自方法#3.
3.)
var buffer = new byte[sizeof(int)];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(buffer);
}
return BitConverter.ToInt32(buffer, 0);
Run Code Online (Sandbox Code Playgroud)
注意:我也尝试将RNGCryptoServiceProvider作为类字段在初始化容器类时初始化一次以简化GC的工作,但是我花了相同的时间来生成所以我认为这将是"更随机".
4)
return new Random(Method3()).Next();
Run Code Online (Sandbox Code Playgroud)
5.)
return new Random(Method3()).Next(Int32.MinValue, Int32.MaxValue);
Run Code Online (Sandbox Code Playgroud)
我知道,在每次调用时创建新的Random(int种子)非常耗时,但碰撞更少,对吧?
好吧,现在是神秘的一部分.我认为大多数碰撞都会有方法#1和#2,其中#1会稍微快一点,而且碰撞时间更短,碰撞最少的方法是#4和#5,其中#4会稍微快一点,而且方法## 3会有某种妥协.
所以我做了一个测试来证明我的假设.我使用所提到的每种方法生成了10倍(以使其平均)一百万个随机数,并获得了生成一百万个数字所需的平均碰撞次数和平均时间.结果(下面)对我来说有点意外.
结果:持续时间为小时:分钟:秒:毫秒格式
Method1: AvgCollisions: 235, AvgDuration: 00:00:00.3561967
Method2: AvgCollisions: 116, AvgDuration: 00:00:00.4042033
Method3: AvgCollisions: 115, AvgDuration: 00:00:04.6037259
Method4: AvgCollisions: 234, AvgDuration: 00:00:09.2195856
Method5: AvgCollisions: 233, AvgDuration: 00:00:09.1788223
Run Code Online (Sandbox Code Playgroud)
我再次进行了几次测试,它总是大致相同.
你也不奇怪吗?时间并不是我想象的那么多,但结果对我来说意味着,方法2是最好的生成随机数,因为它是最随机的,最快的,你可以设置一个最小和最大生成的数字.不知道Method2对Method3的预测程度有多大,因为我不知道如何测试它.
有人可以解释一下我做错了什么,或者为什么方法#4和#5没有碰撞最少,为什么碰撞的百分比总是一样的?它不应该是随机的吗?
编辑: 这是我已经完成的这个测试的Visual Studio 2010解决方案:http://bit.ly/nxLODw
我有一个方法可以随机生成字母数字组合.如果我在循环中调用它,它将返回相同的组合,但如果我放置一个断点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) 我已经用谷歌搜索过了,但还没有答案。
所以问题是,我需要创建随机生成器 API 如下:
public static Double Range(Double minValue, Double maxValue)
{
return random.NextDouble() * (maxValue - minValue) + minValue; // random is just System.Random
}
Run Code Online (Sandbox Code Playgroud)
一切正常,直到我将Double.MinValue和Double.MaxValue放入参数中,因为它生成“无限”无效双精度值(因为操作产生的值超出 64 位双精度值范围)。
有没有办法编写代码,以便即使使用Double.MinValue和Double.MaxValue也可以处理和生成有效的双精度值?
我基本上只想在由'|'拆分的字符串中选择一个随机值.我找不到一个好的例子,有人有想法吗?
string[] mystrings = ("apple|orange|mayo|fruit|dog"):
string blah = "here i am "+resultsofrandom+" result chosen from mystring was " resultofrandom
Run Code Online (Sandbox Code Playgroud)
很明显,字符串blah只是一个例子,我只是希望从mystrings中随机选择的字符串返回一个新的字符串...
我想生成160个不同的随机用户和密码,现在当我在用户和密码变量(在for循环中)添加断点时,代码似乎工作正常.但是当我运行没有断点的代码时,Passwords.csv对所有160行都有相同的输出.任何帮助表示赞赏
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace WriteCSVPasswords
{
class Program
{
static void Main(string[] args)
{
string path = @"c:\temp\Passwords.csv";
string user = null;
string password = null;
string[] file = new string[160];
for (int i = 0; i < 160; i++)
{
user = CreatePassword(4);
password = CreatePassword(5);
file[i] = user + ";" + password + ";" + Base64Encode(user + ":" + password);
user = null;
password = null;
}
if …Run Code Online (Sandbox Code Playgroud) 我在静态类中有一个静态方法,它可以生成随机字符串,如下所示:
public static class DataGenerator
{
public static string GenerateRandomString(int length)
{
const string Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var random = new Random();
return new string(
Enumerable.Repeat(Chars, length)
.Select(s => s[random.Next(s.Length)])
.ToArray());
}
}
Run Code Online (Sandbox Code Playgroud)
当我从同一个调用函数多次调用此方法时,它似乎缓存生成的字符串.
以下是一个用法示例:
var item = new CodeDescActivePo()
{
Active = true,
Code = DataGenerator.GenerateRandomString(10),
Description = DataGenerator.GenerateRandomString(10)
};
Run Code Online (Sandbox Code Playgroud)
请注意,有两个对GenerateRandomString的调用,我希望有两个唯一的随机数,在这种情况下,代码和描述总是相同的.
为什么GenerateRandomString每次都不会生成一个新的随机数?