如何生成随机5位数取决于用户摘要

时间:2018-06-15 13:00:22

标签: c# asp.net random

你好我尝试用5位数生成50号码取决于用户总摘要。例如,用户给出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;
            }

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

enter image description here

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

也许试试这个:

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()添加一个缺失的数字。