C# 如何创建非重复随机数数组
我在C#中有一个抽奖应用程序,它接受要抽奖的数字和最大抽奖数字。我已经编码到创建一个包含所需随机数字的数组,但我需要它们是唯一的,并且在执行时遇到困难。如果有人能给我一些建议,我将非常感激,谢谢 以下是我目前的代码:C# 如何创建非重复随机数数组,c#,arrays,for-loop,random,tostring,C#,Arrays,For Loop,Random,Tostring,我在C#中有一个抽奖应用程序,它接受要抽奖的数字和最大抽奖数字。我已经编码到创建一个包含所需随机数字的数组,但我需要它们是唯一的,并且在执行时遇到困难。如果有人能给我一些建议,我将非常感激,谢谢 以下是我目前的代码: class Lottery { static int[] numberHolder; //array to be filled with numbers up to an //amount entered by t
class Lottery
{
static int[] numberHolder; //array to be filled with numbers up to an
//amount entered by the user eg 42 Max
static int[] drawHolder; //array to hold the each random number
//drawn from the pool of numbers eg 7 numbers
public Lottery() //Lottery class Constructor
{
}
//method which takes in a number limit and amount of numbers to be drawn
public String drawNumbers(int numLimit, int numAmount)
{
Random RandomNumber = new Random();
for (int i = 0; i < numLimit ; i++) //loop to fill up numberHolder array
// with predefined limit of numbers
{
numberHolder[i] = i++;
}
for (int i = 0; i < numAmount; i++)
{
// code to pick unique random numbers no greater than numAmount
// and add them to the drawHolder[] array
drawHolder[i] = RandomNumber.Next(1, numLimit);
}
//return the drawHolder array to String
return null;
}
}
类彩票
{
static int[]numberHolder;//要用数字填充的数组,最大值为
//用户输入的金额,例如最大42
static int[]drawHolder;//用于保存每个随机数的数组
//从数字池中抽取,如7个数字
公共彩票()//彩票类构造函数
{
}
//方法,该方法接受数字限制和要绘制的数字量
公共字符串drawNumber(int numLimit、int numAmount)
{
随机数=新随机数();
for(int i=0;i
有很多方法可以做到这一点。如果数组[i]==array[i+1]听起来洗牌数组比生成随机数更好,那么您可以排序并比较。你可以这样做:
int[] ShuffleArray(int[] array)
{
Random r = new Random();
for (int i = array.Length; i > 0; i--)
{
int j = r.Next(i);
int k = array[j];
array[j] = array[i - 1];
array[i - 1] = k;
}
return array;
}
public String drawNumbers(int numLimit, int numAmount) {
var numbers = Infinite(() => random.Next(numLimit)).Distinct().Take(numAmount);
return string.Join(" ", numbers);
}
private Random random = new Random();
private static IEnumerable<T> Infinite<T>(Func<T> generator) {
while (true) yield return generator();
}
归功于。有几个选项,您可以使用Contains
方法
numberHolder.Contains(value)
使用Any()方法
在我看来,你应该改变你的方法
我不想“我将生成随机索引来选择我的数字”,在这里你必须确保你没有得到任何重复的数字,我只需要洗牌数组,然后首先取你需要的X。这样,您就不必担心索引或重复项
因此,您的第二个for循环将更改为
drawHolder = numberHolder.OrderBy(x => new Guid()).Take(numAmount);
(请注意,我使用了new Guid()
,因此您可以删除RandomNumber
声明行。如前所述,Guid是一个唯一的值,不打算用作随机生成。您也可以使用x=>RandomNumber.Next()
,但如果确实需要一个强大而可靠的shuffer,请阅读)
您还可以用一个简单的可枚举的.Range
因此,您的整个代码将变成(请注意,我已将您的方法名称更改为使用C#约定,方法名称应使用PascalCase)
这可以通过对非重复整数数组使用洗牌算法轻松实现:
public int[] GenerateNonRepeatingNumbers(int seed, int min, int range)
{
// Make sure range is an appropriate value
if (range <= 0)
{
throw new ArgumentException("Range must be greater than zero.");
}
// Make an array to hold our numbers
int[] numbers = new int[range];
// Seed the RNG.
Random rng = new Random(seed);
// Fill the array with all numbers from min to min + range
for (int i = 0; i < range; numbers[i] = min + i++) { }
int
a = 0, // Swap index
t = 0; // Temporary value storage
// Scramble the values
for (int i = 0; i < range; i++)
{
// Get a random index that isn't i
while ((a = rng.Next(range)) == i) { };
// Store the old value at i
t = numbers[i];
// Change the old value to the value at the random index
numbers[i] = numbers[a];
// Set value at random index to our old value from numbers[i]
numbers[a] = t;
}
return numbers;
}
public int[]generateNonRepeatingNumber(整数种子、整数最小值、整数范围)
{
//确保范围为适当的值
如果(范围我会保持简单:
private Random _rnd = new Random();
public String drawNumbers(int numLimit, int numAmount)
{
return String.Join("," ,
Enumerable
.Range(1, numLimit)
.OrderBy(x => _rnd.Next())
.Take(numAmount));
}
将Random
实例的声明保留在方法之外,以防止在快速连续调用该方法时返回相同的序列。我会这样使用:
int[] ShuffleArray(int[] array)
{
Random r = new Random();
for (int i = array.Length; i > 0; i--)
{
int j = r.Next(i);
int k = array[j];
array[j] = array[i - 1];
array[i - 1] = k;
}
return array;
}
public String drawNumbers(int numLimit, int numAmount) {
var numbers = Infinite(() => random.Next(numLimit)).Distinct().Take(numAmount);
return string.Join(" ", numbers);
}
private Random random = new Random();
private static IEnumerable<T> Infinite<T>(Func<T> generator) {
while (true) yield return generator();
}
虽然为时已晚,但我使用的是我创建的名为M_Randomizer的方法
using System;
class Randomizer
{
public int[] M_Randomizer(int x)
{
bool b = false;
if (x < -1)
{
b = true;
x = -1 * x;
}
if(x == -1)
x = 0;
if (x < 2)
return new int[x];
int[] site;
int k = new Random(Guid.NewGuid().GetHashCode()).Next() % 2;
if (x == 2)
{
site = new int[2];
site[0] = k;
site[1] = 1 - site[0];
return site;
}
else if (x == 3)
{
site = new int[3];
site[0] = new Random(Guid.NewGuid().GetHashCode()).Next(0, 3);
site[1] = (site[0] + k + 1) % 3;
site[2] = 3 - (site[0] + site[1]);
return site;
}
site = new int[x];
int a = 0, m = 0, n = 0, tmp = 0;
int[] p = M_Randomizer(3);
int[] q;
if (x % 3 == 0)
q = M_Randomizer(x / 3);
else
q = M_Randomizer((x / 3) + 1);
if (k == 0)
{
for (m = 0; m < q.Length; m++)
{
for (n = 0; n < p.Length && a < x; n++)
{
tmp = (q[m] * 3) + p[n];
if (tmp < x)
{
site[a] = tmp;
a++;
}
}
}
}
else
{
while (n < p.Length)
{
while (a < x)
{
tmp = (q[m] * 3) + p[n];
if (tmp < x)
{
site[a] = tmp;
a++;
}
m = m + k;
if (m >= q.Length)
break;
}
m = m % q.Length;
n++;
}
}
a = (new Random(Guid.NewGuid().GetHashCode()).Next() % 2) + 1;
k = new Random(Guid.NewGuid().GetHashCode()).Next() % 10;
if (k > 5)
for (int i = a; i < k; i++)
while (a < site.Length)
{
if (k % (a + 1) == 0)
{
tmp = site[a - 1];
site[a - 1] = site[a];
site[a] = tmp;
}
a = a + 2;
}
k = new Random(Guid.NewGuid().GetHashCode()).Next() % 10;
if (k > 5)
{
n = x / 2;
k = 0;
if (x % 2 != 0)
k = (new Random(Guid.NewGuid().GetHashCode()).Next() % 2);
p = new int[n + k];
m = (x - n) - k;
for (a = 0; m < x; a++, m++)
p[a] = site[m];
m = n + k;
for (a = (x - m) - 1; a >= 0; a--, m++)
site[m] = site[a];
for (a = 0; a < p.Length; a++)
site[a] = p[a];
}
int[] site2;
int[] site3 = new int[x];
if (b)
return site;
else
site2 = M_Randomizer(-1 * x);
for (a = 0; a < site.Length; a++)
site3[site2[a]] = site[a];
return site3;
}
public int[] M_Randomizer(int x, int start)
{
int[] dm = M_Randomizer(x);
for(int a = 0; a < x; a++)
dm[a] = dm[a] + start;
return dm;
}
}
使用系统;
类随机化器
{
公共int[]M_随机化器(int x)
{
布尔b=假;
如果(x<-1)
{
b=正确;
x=-1*x;
}
如果(x==-1)
x=0;
if(x<2)
返回新的int[x];
int[]站点;
int k=new Random(Guid.NewGuid().GetHashCode()).Next()%2;
如果(x==2)
{
地点=新的整数[2];
站点[0]=k;
站点[1]=1-站点[0];
返回站点;
}
else如果(x==3)
{
地点=新的整数[3];
站点[0]=newrandom(Guid.NewGuid().GetHashCode()).Next(0,3);
站点[1]=(站点[0]+k+1)%3;
站点[2]=3-(站点[0]+站点[1]);
返回站点;
}
地点=新整数[x];
INTA=0,m=0,n=0,tmp=0;
int[]p=M_随机化器(3);
int[]q;
如果(x%3==0)
q=M_随机化器(x/3);
其他的
q=M_随机化器((x/3)+1);
如果(k==0)
{
对于(m=0;m=q.长度)
打破
}
m=m%q.长度;
n++;
}
}
a=(新随机(Guid.NewGuid().GetHashCode()).Next()%2)+1;
k=新随机(Guid.NewGuid().GetHashCode()).Next()%10;
如果(k>5)
for(int i=a;i5)
{
n=x/2;
k=0;
如果(x%2!=0)
using System;
class Randomizer
{
public int[] M_Randomizer(int x)
{
bool b = false;
if (x < -1)
{
b = true;
x = -1 * x;
}
if(x == -1)
x = 0;
if (x < 2)
return new int[x];
int[] site;
int k = new Random(Guid.NewGuid().GetHashCode()).Next() % 2;
if (x == 2)
{
site = new int[2];
site[0] = k;
site[1] = 1 - site[0];
return site;
}
else if (x == 3)
{
site = new int[3];
site[0] = new Random(Guid.NewGuid().GetHashCode()).Next(0, 3);
site[1] = (site[0] + k + 1) % 3;
site[2] = 3 - (site[0] + site[1]);
return site;
}
site = new int[x];
int a = 0, m = 0, n = 0, tmp = 0;
int[] p = M_Randomizer(3);
int[] q;
if (x % 3 == 0)
q = M_Randomizer(x / 3);
else
q = M_Randomizer((x / 3) + 1);
if (k == 0)
{
for (m = 0; m < q.Length; m++)
{
for (n = 0; n < p.Length && a < x; n++)
{
tmp = (q[m] * 3) + p[n];
if (tmp < x)
{
site[a] = tmp;
a++;
}
}
}
}
else
{
while (n < p.Length)
{
while (a < x)
{
tmp = (q[m] * 3) + p[n];
if (tmp < x)
{
site[a] = tmp;
a++;
}
m = m + k;
if (m >= q.Length)
break;
}
m = m % q.Length;
n++;
}
}
a = (new Random(Guid.NewGuid().GetHashCode()).Next() % 2) + 1;
k = new Random(Guid.NewGuid().GetHashCode()).Next() % 10;
if (k > 5)
for (int i = a; i < k; i++)
while (a < site.Length)
{
if (k % (a + 1) == 0)
{
tmp = site[a - 1];
site[a - 1] = site[a];
site[a] = tmp;
}
a = a + 2;
}
k = new Random(Guid.NewGuid().GetHashCode()).Next() % 10;
if (k > 5)
{
n = x / 2;
k = 0;
if (x % 2 != 0)
k = (new Random(Guid.NewGuid().GetHashCode()).Next() % 2);
p = new int[n + k];
m = (x - n) - k;
for (a = 0; m < x; a++, m++)
p[a] = site[m];
m = n + k;
for (a = (x - m) - 1; a >= 0; a--, m++)
site[m] = site[a];
for (a = 0; a < p.Length; a++)
site[a] = p[a];
}
int[] site2;
int[] site3 = new int[x];
if (b)
return site;
else
site2 = M_Randomizer(-1 * x);
for (a = 0; a < site.Length; a++)
site3[site2[a]] = site[a];
return site3;
}
public int[] M_Randomizer(int x, int start)
{
int[] dm = M_Randomizer(x);
for(int a = 0; a < x; a++)
dm[a] = dm[a] + start;
return dm;
}
}