我有这段代码:
Random num = new Random();
int check = CheckIfOdd(num.Next(1, 1000000));
int counter = 1;
while (check <= 0)
{
if (check % 2 == 0)
{
check = CheckIfOdd(num.Next(1, 1000000)); ;
}
counter++;
}
int[] nArray = new int[check];
int arLength = 0;
//generate arrays with pairs of numbers, and one number which does not pair.
for (int i = 0; i < check; i++)
{
arLength = nArray.Length;
if (arLength == i + 1)
{
nArray[i] = i + 1;
}
else
{
nArray[i] = i;
nArray[i + 1] = i;
}
i++;
}
哪个有点工作,但不如我想的那样好。
它应该生成一个包含1到1百万个元素的数组,其中的数字可以在1到10亿之间。
它必须在数组中的随机位置(它现在没有)生成两对每个数字,然后它应该包含1个没有对的数字...
我只是在寻找一种更好的方法,因为它不是在随机位置,并且它不能在10亿到10亿之间正确生成数字。
修改 我有人建议:(通过oerkelens)
var total = new Random().Next(500000) * 2 + 1;
var nArray = new int[total];
for (var i = 1; i < total; i += 2)
{
nArray[i] = i;
nArray[i - 1] = i;
}
nArray[total - 1] = total;
哪个更好,而不是代码,但它不会以随机顺序放置值。
编辑2 这几乎可以满足我的需要,但它不会产生正确的数量。 如上所述,它应该生成多达x个元素,数字在1-y
之间Random r = new Random();
int[] output = Enumerable.Range(0, 11).Select(x => x / 2).OrderBy(x => r.Next()).ToArray();
by Enigmativity
答案 0 :(得分:3)
试试这段代码:
int[] output = Enumerable.Range(0, 11).Select(x => x / 2).ToArray();
它生成一个包含以下值的数组:
{ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5 }
您应该能够将此扩展到您需要的任意数量的元素。
如果您想以随机顺序输出,请尝试以下操作:
Random r = new Random();
int[] output = Enumerable.Range(0, 11).Select(x => x / 2).OrderBy(x => r.Next()).ToArray();
在一次运行中,作为一个例子,我得到了这个:
{ 0, 4, 1, 2, 2, 4, 5, 3, 3, 1, 0 }
要使用一个元素生成大量随机对,您可以这样做:
Random r = new Random();
int pairs = 5; //elements = 2 * pairs + 1;
int max = 100;
int[] output =
Enumerable
.Range(0, pairs)
.Select(x => r.Next(1, max + 1))
.SelectMany(x => new [] { x, x })
.StartWith(r.Next(1, max + 1))
.OrderBy(x => r.Next())
.ToArray();
但是,这并不能保证您最终不会发生3次,4次或更多次冲突的冲突。
这不需要“System.Interactive”:
int[] output =
new [] { r.Next(1, max + 1) }
.Concat(
Enumerable
.Range(0, pairs)
.Select(x => r.Next(1, max + 1))
.SelectMany(x => new [] { x, x }))
.OrderBy(x => r.Next())
.ToArray();