Ich versuche, ein großes Array von Zufallszahlen mit LINQ zu erstellen.System OutOfMemoryException beim Generieren von Array von Zufallszahlen
Ich möchte im Bereich 1.000.000 Zahlen erzeugen, die von 1 - 2147483647
Der folgende Code gut für kleine Zahlen funktioniert:
int[] numbers = Enumerable.Range(1, 2147483647)
.OrderBy(x => rnd.Next())
.Take(num)
.ToArray();
Aber erzeugt eine System.OutOfMemory Ausnahme, wenn ein großes Array zu erzeugen versuchen, .
Was ist der beste Weg, um das zu erreichen, was ich suche?
Edit: Danke für die Hilfe so weit, ich werde schreiben, warum ich das und meinen vollen Programmcode so mache:
In Bezug auf das Array, sollte es keine Duplikate enthält.
Ich schreibe ein Programm, das durch alle Zahlen iterieren, sie paaren und das Paar mit der geringsten Differenz zwischen ihnen zurückgeben wird. Oder geben Sie eine Liste aller Paare mit der kleinsten Differenz zurück, wenn es sich um Duplikate handelt.
Vollprogrammcode:
static void Main(string[] args)
{
// Keep running until close
while (true)
{
Console.WriteLine("Write a number:");
Console.WriteLine(ClosestNumbers(Convert.ToInt32(Console.ReadLine())));
}
}
public static string ClosestNumbers(int num)
{
string returnString = "\n\nRandom numbers:\n";
returnString += "---------------------------------------\n";
Random rnd = new Random();
// Generate array of {num} random numbers ranging from 1 to 2147483647.
int[] numbers = Enumerable.Range(1, 1000000)
.OrderBy(x => rnd.Next(1, 2147483647))
.Take(num)
.ToArray();
//returnString += string.Join(",", numbers.ToArray()) + "\n";
// Array format: {num1, num2, difference}
List<int[]> pairedDifferences = new List<int[]>();
int endPoint = numbers.Length;
int difference = 0;
for (int i = 0; i < endPoint - 1; i++)
{
for (int a = i + 1; a < endPoint; a++)
{
if (numbers[i] > numbers[a])
{
difference = numbers[i] - numbers[a];
}
else
{
difference = numbers[a] - numbers[i];
}
pairedDifferences.Add(new int[] { numbers[i], numbers[a], difference });
}
}
int minDiff = pairedDifferences.Min(x => x[2]);
List<int[]> minDiffsList = pairedDifferences.Where(x => x[2] == minDiff).ToList();
returnString += "---------------------------------------\n\n\n";
returnString += "Smallest difference(s) found between:\n\n";
foreach (int[] minDiffItem in minDiffsList)
{
// minDiffItem[0]; // first num
// minDiffItem[1]; // second num
// minDiffItem[2]; // difference
returnString += $"{minDiffItem[0]} and {minDiffItem[1]}, with a difference of {minDiffItem[2]}.\n";
}
returnString += "\n\n\n===================================================================\n";
returnString += "===================================================================\n\n\n";
return returnString;
}
Edit 2:
Ich bin jetzt eine andere OutOfMemory Ausnahme an der Linie pairedDifferences.Add(new int[] { numbers[i], numbers[a], difference });
bekommen. Kennt jemand einen besseren Weg, dies zu tun? Entschuldigung, das ist das erste Mal, dass ich so etwas mache.
Klingt wie AB Problem, können Sie teilen, warum Sie Array von Zufallszahlen so groß erstellen müssen? –
"Ich möchte 1.000.000 Zahlen von 1 - 2147483647 generieren." Dubletten ausschließen? –
Dieser Beitrag kann Ihnen helfen, die Grenzen eines Arrays zu verstehen: https://stackoverflow.com/questions/1391672/what-is-the-maximum-size-that-an-array-canhold –