Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建非重复随机数数组_C#_Arrays_For Loop_Random_Tostring - Fatal编程技术网

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

我在C#中有一个抽奖应用程序,它接受要抽奖的数字和最大抽奖数字。我已经编码到创建一个包含所需随机数字的数组,但我需要它们是唯一的,并且在执行时遇到困难。如果有人能给我一些建议,我将非常感激,谢谢

以下是我目前的代码:

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;
    }
}