如何生成随机数而不重复/重复相同的数字?

时间:2017-10-23 05:48:09

标签: c# .net winforms random duplicates

我想要它做的是生成100个文件,每个文件具有不同的随机大小。如果行:

long rndsize = rnd.Next(1, 2000);

生成数字43然后再次生成此数字。

在构造函数中:

CreateFiles(100);

方法:

for (int i = 0; i < numberoffiles; i++)
{
    Random rnd = new Random();
    long rndsize = rnd.Next(1, 2000);
    FileStream fs = new FileStream(@"c:\temp\files\huge_dummy_file" + i, FileMode.CreateNew);
    fs.Seek(rndsize * 1024, SeekOrigin.Begin);
    fs.WriteByte(0);
    fs.Close();
}

6 个答案:

答案 0 :(得分:3)

添加一个哈希集,当你对一个数字进行检查时,检查它是否存在。如果确实有另一个数字。 您只生成了100个文件,因此在上一次迭代中,您必须使用大约20个数字,但这不会花费太长时间。

添加HashSet<int> existingNumbers = new HashSet<int>();

而不是long rndsize = rnd.Next(1, 2000);

执行:

int rndsize;
do {
  rndsize = rnd.Next(1, 2000);
} while (existingNumbers.Contains(rndsize));
existingNumbers.Add(rndsize);

答案 1 :(得分:1)

很简单。只需在生成时写下每个数字。然后检查新号码是否等于生成。

答案 2 :(得分:1)

首先只创建Random的一个实例,然后使用列表存储所有生成的数字并在创建具有新生成数字的文件之前进行检查

Random rnd = new Random();
List<long> generatedNumbers = new List<long>();
for (int i = 0; i < numberoffiles; i++)
{
    long rndsize = rnd.Next(1, 2000);
    if(generatedNumbers.Contains(rndSize)) 
    {
      i--;
      continue;
    }

    generatedNumbers.Add(rndSize);
    FileStream fs = new FileStream(@"c:\temp\files\huge_dummy_file" + i, FileMode.CreateNew);
    fs.Seek(rndsize * 1024, SeekOrigin.Begin);
    fs.WriteByte(0);
    fs.Close();
}

答案 3 :(得分:1)

添加现有答案:

您获得相同结果的原因是您在每次循环迭代时都在创建Random类的新实例。

此类使用种子生成伪随机数,最初使用当前刻度计数DateTime.Now计算。请求新的随机整数后,该种子会发生变化,为下一个随机数做准备。

如果每次迭代都生成一个新实例,那么实例很可能会有相同的种子,这会导致它们产生相同的结果。

答案 4 :(得分:1)

为避免重复,您必须检查是否已生成该号码。对于快速查找,您可以使用HashSet。这是非常简单的解决方案 - 为了避免无限循环,迭代次数有限制。

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var rnd = new Random();
        var rndGen = new UniqueRandomGenerator(rnd);

        Console.WriteLine("Next random values from 1 to 5:");
        for (int i = 1; i <= 5; i++) {
            var next = rndGen.GetNext(1, 6);
            Console.WriteLine(next);
        }
    }

    class UniqueRandomGenerator
    {
        readonly Random _rnd;
        readonly HashSet<int> _generated;
        readonly static int MAX_ITER_WHILE_GET_NEXT_RND = 100;

        public UniqueRandomGenerator(Random rnd) 
        {
            _rnd = rnd;
            _generated = new HashSet<int>();

        }

        public int GetNext(int lower, int upper) {
            int next;
            int i = 0;
            do {
                next = _rnd.Next(lower, upper);
                i++;
                if (i > MAX_ITER_WHILE_GET_NEXT_RND)
                    throw new InvalidOperationException("Exceed iter limit!");
            }
            while (_generated.Contains(next));
            _generated.Add(next);
            return next;
        }
    }
}

答案 5 :(得分:0)

您也可以使用guid。它每次都会生成不同的数字。这是asp.net中的内置功能。它通过创建一个生成随机数的函数来做得好得多。