你好我尝试用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;
}
我已经尝试了但是我的数组中的值具有负值,我只想获得 正值
请帮助我,如何解决这个问题并感谢您的进步。
答案 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();
}
答案 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()
添加一个缺失的数字。