Как выбрать случайное число из массива целых чисел и сделать его уникальным каждый раз
Я написал код для генерации популяции для генетического алгоритма, в котором каждая хромосома представляет собой матрицу размером 5 * 5, где каждая клетка связана с координатами, сгенерированными вызовом метода "calculateCellsCenters(200, 325)". Для каждой хромосомы мне нужно сгенерировать случайное местоположение для объекта под названием AUV, где это случайное местоположение должно быть выбрано из местоположений, сгенерированных этим методом. Мне нужно, чтобы местоположение AUV было уникальным для каждой хромосомы, но, к сожалению, я получил дублирование, и я также думаю, что выбранные местоположения выбираются не из всех доступных вариантов, а только из части. Есть идеи??
using System; using System.IO; using System.Text; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading; using AUV_Topology; using System.Collections.Generic; using System.Media; using System.Linq; static int[,] auvChromosomes; static int[][,] population; static int[,] auvChromosomeLocations; static int randomIndex; // to select random X or Y coordinates from the array of cellsCenters for the AUV random loaction in each chromosome static int prevRandomIndex; // to make sure that each time we will get different randomIndex; static int[,] cellsCenters; static int[] columnsXs; static int[] rowsYs; private void moveGenetic_Click(object sender, EventArgs e) { FileStream fs = new FileStream("C:/Users/Welcome/Desktop/intialPopulation.txt", FileMode.Append,FileAccess.Write); population = new int[6][,]; // jagged array auvChromosomeLocations = new int[6, 2]; // for all the six chromosomes that will be generated, 0 for X coordinate and 1 for Y coordinate Random rnd = new Random(); // to gereate random number (either 0 or 1) calculateCellsCenters(200, 325); // Compute all the center points (Xc,Yc) for all cells of the partitioned region (grid) auvChromosomes = new int[5, 5]; for (int i = 0; i < population.Length; i++) { population[i] = new int[5, 5]; } prevRandomIndex = 0; randomIndex = 0; using (StreamWriter sw = new StreamWriter(fs)) { for (int i = 0; i < population.Length; i++) { for (int j = 0; j < 5; j++) { for (int k = 0; k < 5; k++) { auvChromosomes[j, k] = rnd.Next(0, 2); sw.Write("|" + auvChromosomes[j, k] + "|"); } // end-inner-for sw.WriteLine(); } // end-outer-inner-for while (prevRandomIndex == randomIndex) { randomIndex = rnd.Next(0, 5); // to select random X or Y coordinates from the array of cellsCenters for the AUV random loaction in each chromosome } auvChromosomeLocations[i, 0] = cellsCenters[0, randomIndex]; auvChromosomeLocations[i, 1] = cellsCenters[1, randomIndex]; prevRandomIndex = randomIndex; sw.WriteLine("#------------#" + "AUV Location for chromosome # : " + i + " =" + " (" + auvChromosomeLocations [i, 0+ "," +auvChromosomeLocations [i, 1] + ")" + "#------------#"); } // end-outer-for } // end-using //Genetic_Algorithm(population); } public void calculateCellsCenters(int intialPoint,int lastPoint) { double diagonalLength; FileStream fs = new FileStream("C:/Users/Welcome/Desktop/testPositions.txt", FileMode.Append, FileAccess.Write); int d = lastPoint - intialPoint; int cellSide = d /5; // to get matrix 5* 5 as our region in our case is 125 * 125 int intialCell = intialPoint - cellSide; // to get the intial value of the first element in the two arrays (columns & rows) less than 200 in our case int centerPoint; columnsXs = new int[6]; cellsCenters = new int[2, 5]; // 0 for the point on the x axis and 1 for the point on the y axis so this is why the first element of size 2 rowsYs = new int[6]; diagonalLength = cellSide * Math.Sqrt(2); centerPoint = (int) diagonalLength / 2; columnsXs[0] = 200; // its equal to 175 in our case to let the first point for the first column equal to 200 later on /* * Calculate The Columns Points * * */ for (int k = 1; k < 6; k++) { columnsXs[k] = columnsXs[k-1] + cellSide; } rowsYs[0] = 200; // its equal to 175 in our case to let the first pint for the first column equal to 200 later on /* * Calculate The Rows Points * * */ for (int s = 1; s < 6; s++) { rowsYs[s] = rowsYs[s-1] + cellSide; } //////////////////////////calculate-centers/////////////////////////// using (StreamWriter sw = new StreamWriter(fs)) { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { cellsCenters[0, j] = columnsXs[j] + centerPoint; cellsCenters[1, j] = rowsYs[i] + centerPoint; sw.Write(" " + "(" + cellsCenters[0, j] + "," + cellsCenters[1, j] + ")" + " " ); } sw.WriteLine(); } } }
Я получил следующие результаты, напечатанные в txt-файле:
|0||1||0||0||0| |0||0||1||1||0| |1||1||1||1||1| |0||1||1||1||0| |0||1||0||0||0| #------------#AUV Location for chromosome # : 0 = (267,317)#------------# |0||0||0||1||0| |0||1||1||0||0| |0||1||1||0||0| |0||0||0||1||0| |1||0||0||1||0| #------------#AUV Location for chromosome # : 1 = (292,317)#------------# |1||0||0||0||1| |1||0||1||1||1| |1||0||0||1||0| |1||0||0||0||0| |1||1||1||1||1| #------------#AUV Location for chromosome # : 2 = (317,317)#------------# |0||1||1||1||0| |1||1||0||0||0| |1||0||1||0||1| |0||0||0||1||0| |0||0||0||0||0| #------------#AUV Location for chromosome # : 3 = (292,317)#------------# |0||0||0||0||0| |0||1||1||1||0| |0||0||1||1||1| |0||0||1||1||0| |1||0||0||1||1| #------------#AUV Location for chromosome # : 4 = (242,317)#------------# |0||1||1||1||1| |0||0||1||1||0| |0||0||0||1||0| |0||1||0||1||1| |1||0||1||1||0| #------------#AUV Location for chromosome # : 5 = (292,317)#------------#
Я получил следующие местоположения (из метода" calculateCellsCenters"), которые мне нужно выбрать из них:
(217,217) (242,217) (267,217) (292,217) (317,217) (217,242) (242,242) (267,242) (292,242) (317,242) (217,267) (242,267) (267,267) (292,267) (317,267) (217,292) (242,292) (267,292) (292,292) (317,292) (217,317) (242,317) (267,317) (292,317) (317,317)
Что я уже пробовал:
Мне нужно получить уникальное местоположение AUV для каждой хромосомы. Мне нужно каждый раз выбирать местоположение случайным образом из массива "cellsCenters".
Richard MacCutchan
Вам нужно создать еще один массив для хранения каждого выбранного вами местоположения. Затем каждый раз, когда вы выбираете один из них, вы проверяете, существует ли он уже в этом массиве. Если это так, то он не уникален, поэтому вы не можете его использовать. Если он не существует, то добавьте его в массив, прежде чем использовать.
Richard MacCutchan
Логика этого довольно проста. Каждый раз, когда вы получаете случайное число, вам нужно сверить его со списком ранее выбранных чисел, чтобы увидеть, является ли оно уникальным. Поэтому создайте простой массив и каждый раз проверяйте, находится ли значение в массиве. Если он уже есть, то он не уникален, поэтому выберите другой и повторите процесс. Если он не существует в массиве, то он уникален, поэтому добавьте его в массив перед использованием.
Member 11247684
Не могли бы вы поместить этот фрагмент кода сюда, так как у меня есть еще одна проблема: Выбранные места для AUV, похоже, находятся только в последней строке :
(217,317) (242,317) (267,317) (292,317) (317,317)
Где у меня есть:
(217,217) (242,217) (267,217) (292,217) (317,217)
(217,242) (242,242) (267,242) (292,242) (317,242)
(217,267) (242,267) (267,267) (292,267) (317,267)
(217,292) (242,292) (267,292) (292,292) (317,292)
(217,317) (242,317) (267,317) (292,317) (317,317)