c# Random不能很好地工作
本文关键字:工作 很好 不能 Random | 更新日期: 2023-09-27 17:53:06
我想做一个随机的项目选择器,随机选择3 × 3的项目。概率是不相等的。
namespace Picker
{
class Program
{
static bool doContinue = true;
static double[] numbers = { 4, 12, 28, 60, 124, 252, 508, 1020, 2044, 4092, 4120, 4176, 4288, 4512, 4960, 5856, 7648, 11232, 18400, 32736 };
static string Pick()
{
double rnd = new Random().NextDouble() * 32736;
byte type = 0;
for (byte i = 0; i < 20; i++) {
if (rnd <= numbers[i])
{
type = i;
break;
}
}
string reverString = "";
if (type < 10)
{
reverString = " Reverse";
}
return "T" + (10 - (type % 10)).ToString() + reverString;
}
static void Main(string[] args)
{
while (doContinue)
{
Console.WriteLine(Pick());
Thread.Sleep(2);
Console.WriteLine(Pick());
Thread.Sleep(2);
Console.WriteLine(Pick());
Thread.Sleep(2);
Console.ReadLine();
}
}
}
}
3 × 3的选择总是相同的事情3次,然后它改变。
PS:我知道,doContinue的事情没有实现。
一个Random
对象基于当前机器时间为自己播种,所以如果你每次调用Pick()
都创建一个新的Random
对象,它将产生与快速连续调用它的次数相同的次数。
尝试重用Random
实例,如下所示:
class Program
{
static bool doContinue = true;
static double[] numbers = { 4, 12, 28, 60, 124, 252, 508, 1020, 2044, 4092, 4120, 4176, 4288, 4512, 4960, 5856, 7648, 11232, 18400, 32736 };
static Random random = new Random();
static string Pick()
{
double rnd = random.NextDouble() * 32736;
...