【问题标题】:How to generate random 5 digit number depend on user summary如何生成随机 5 位数字取决于用户摘要
【发布时间】:2018-11-25 08:01:40
【问题描述】:

嗨,伙计,我尝试根据用户总摘要生成 50 个 5 位数字。例如,用户给 500000,然后我需要随机数 5 位数乘 50 数等于 500000

我试试这个,但它不是 5 位数字

int balane = 500000;
            int nums = 50;
            int max = balane / nums;
            Random rand = new Random();
            int newNum = 0;
            int[] ar = new int[nums];
            for (int i = 0; i < nums - 1; i++)
            {
                newNum = rand.Next(0, max);
                ar[i] = newNum;
                balane -= newNum;
                max = balane / (nums - i - 1);

                ar[nums - 1] = balane;
            }

            int check = 0;
            foreach (int x in ar)
            {
                check += x;
            }

我已经尝试过了,但是我的数组中的值有负值,我只想得到 正值

请帮助我,如何解决这个问题并感谢您的提前。

【问题讨论】:

  • 如果您只需要 50 个随机的 5 位数字,请像这样使用 Random.Next()newNum = rand.Next(10000, 100000);,它将为您提供 10,000 到 99,999 之间的任何数字。
  • 五位数字是 0 到 99999 之间的任何数字。这意味着,Random.Next(100000)。顺便说一下,0001012345 一样随机。
  • 如果要生成5位数字,请拨打Random.Next(10) 5次。直接取数字就不用再尝试把数字转回数字了
  • @PanagiotisKanavos 数字 00010 不是“正确的” 5 位数字,它是用零填充的数字 10。 10,000 是最小的 5 位数字,而 99,999 是最大的。

标签: c# asp.net random


【解决方案1】:

也许试试这个:

var rnd = new Random();

var numbers = Enumerable.Range(0, 50).Select(x => rnd.Next(500_000)).OrderBy(x => x).ToArray();

numbers = numbers.Skip(1).Zip(numbers, (x1, x0) => x1 - x0).ToArray();

numbers = numbers.Append(500_000 - numbers.Sum()).ToArray();

Console.WriteLine(numbers.Count());
Console.WriteLine(numbers.Sum());

这个输出:

50 500000

这是通过生成 0 到 499,999 之间的 50 个随机数来实现的。然后它按升序对它们进行排序,然后得到每个连续对之间的差异。根据定义,这会产生一组 49 个值,加起来几乎是 500,000。然后只需通过 500_000 - numbers.Sum() 添加一个缺失的数字即可。

【讨论】:

    【解决方案2】:

    我曾经在 codereview.stackexchange.com 上问过类似的问题。我已经修改了我的答案,为你生成了一个五位数的序列。

    此外,此代码足够快,可用于在单个请求中创建数万个代码。如果您查看最初的问题和答案(链接到下面),您会发现它会在插入代码之前检查代码是否已被使用。因此,代码是唯一的。

    void Main()
    {
        Console.WriteLine(GenerateCode(CodeLength));
    }
    
    private const int CodeLength = 10;
    // since Random does not make any guarantees of thread-safety, use different Random instances per thread
    private static readonly ThreadLocal<Random> _random = new ThreadLocal<Random>(() => new Random());
    
    // Define other methods and classes here
    private static string GenerateCode(int numberOfCharsToGenerate)
    {
        char[] chars = "0123456789".ToCharArray();
    
        var sb = new StringBuilder();
        for (int i = 0; i < numberOfCharsToGenerate; i++)
        {
            int num = _random.Value.Next(0, chars.Length);
            sb.Append(chars[num]);
        }
        return sb.ToString();
    }
    

    原问答:https://codereview.stackexchange.com/questions/142049/creating-a-random-code-and-saving-if-it-does-not-exist/142056#142056

    【讨论】:

    • 为什么不_random.Value.Next(10) ?只是为了避免格式化?
    • 我喜欢尽可能避免硬编码值。性能差异可以忽略不计。如果编码人员想突然将序列变成字母数字序列,而不是像现在这样简单的数字,他们可能没有意识到他们还必须更新.Next(x) 行,因为代码仍然可以编译。
    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多