2013-11-02 4 views
-2

пусть говорят, что я есть эта матрицаКак выбрать случайные элементы из ряда последовательно от матрицы, но если все элементы в строке выбранного не выбрать ту же строку снова

м =

3  1  2  4  6  5 
2  3  5  6  1  4 
3  4  6  1  2  5 
2  1  3  4  5  6 
3  2  5  6  1  4 
2  4  6  1  5  3 

, которые имеют 6 сырья и в 6 столбце

я хочу, чтобы выбрать случайным образом froms сырья последовательно первый выбор будет выбрать первый

элемент в том, что сырые

так, если случайным завалив все элементы сырых 5 я не хочу, чтобы программа прийти

, чтобы выбрать из него снова

примера, если случайная итерация 1 выберите raw1 он будет идти к первый элемент в raw1 который

в колонке 1

, если случайным в итерации 2 это выбрать тот же raw1 снова выберет второй

элемент в raw1, который находится в колонке 2

так, если я достиг колонки 6 в raw1 и после итерации RAW1 снова выбран, но мой

матрица 6 столбец, поэтому я хочу, чтобы выбрать случайным другое сырье, которое является не достигли до

шестого колонке

пусть говорит, что если каждый раз при выборе сырой я сделаю значение в этом столбце, который равный

один

так, если я бег 20 итерации

JM =

1  1  1  1  1  0 
1  1  0  0  0  0 
1  1  1  1  0  0 
1  1  0  0  0  0 
1  1  1  0  0  0 
1  1  1  1  0  0 

удачи я не достигла шестого столбца в любом из баранов

но если

JM =

1  1  1  1  1  0 
1  1  1  1  0  0 
1  1  0  0  0  0 
1  1  1  1  1  1 
1  0  0  0  0  0 
1  1  0  0  0  0 

Attem для доступа к m (5,7); индекс за пределами границ, потому что размер (m) = [6,6].

, как продолжить случайный выбор, не приходя в том, что сырье, которое уже полно заполнено, как

, что сырье-уже полный заполнен

я надеюсь, что это легко понять

IAM с помощью этого метода чтобы создать хромосомы

, которая находится в форме

м сырья colmun = Machín е задание операции

благодаря

IAM с использованием MATLAB

+0

Какой язык? [Тег: MATLAB]? [теги: rstats]? –

ответ

0

Я вижу три несколько различных методов для достижения этой цели. Вы должны создать массив целых чисел, чтобы хранить информацию, содержащую количество элементов, которые вы уже взяли из каждого сырья. Предположим, что ваша матрица равна [n*n], поэтому массив будет [n]. Назовём его a[n]

Первый метод:

  1. Генерация случайных необработанный номер rNumber.
  2. Проверьте, можете ли вы взять элементы из этого сырья (if(rNumber] < n)). Если вы не можете взять элемент, перейдите к (1). В противном случае продолжать (3)
  3. Возьмем элемент m[rNumber][a[rNumber]] и приращение a[rNumber]

Второй метод:

  1. генерировать случайные числа сырой rNumber.
  2. Проверить, если вы можете взять элементы из этого сырья (if(rNumber] < n))
  3. Если вы не можете взять элемент затем, чтобы увеличить rNumber и перейти к (2). В противном случае по-прежнему (4)
  4. Возьмет элемент m[rNumber][a[rNumber]] и увеличивают a[rNumber]

Последний методу также необходимо хранить количество баранов, где вы взяли все элементы rawCount.

  1. Генерировать случайные числа сырых rNumber между 0 и n-rawCount-1
  2. Перечислит через все баран в то время как currentRaw < rNumber. Если a[currentRaw] < n затем увеличить currentRaw
  3. Возьмем элемент m[currentRaw][a[currentRaw]] и увеличиваем a[currentRaw]
  4. Если a[currentRaw] = n затем увеличить rawCount
0

здесь является то, что я написал в C++. надеюсь, это то, что вы искали.не стесняйтесь спрашивать, не понимаете ли вы что-то

#include "stdafx.h" 
#include<fstream> 
#include<ctime> 
#include<iostream> 

using namespace std; 

ifstream f("stack2.in"); 
ofstream g("stack2.out"); 
int a[10][10]; 
int solution[100],n,m,index =0; 

void build(int n,int m)//create a MxN matrix, and fill it with values 
{ 
    int zz = 1; 
    for(int i=0;i<n;i++) 
     for(int j=0;j<m;j++) 
     { 

      a[i][j]= zz; 
      zz++; 
     } 

} 

void solve() 
{ 
    srand((unsigned)time(0)); 
    int i,j;//column and line 
    while(index<m*n) 
    { 

     i = (rand()%10);//get random values for column and line 
     j = (rand()%10); 

     if(a[i][j]!=0) //if the value of matrix[i][j] is not 0, means that this value is new, so we add it to the solution list 
     { 
      solution[index]=a[i][j]; 
      index++; 
      a[i][j]=0; //set the value from matrix[i][j] to 0 so we don't 'visit' again 
     } 

     else if(i<=n) //if the value from the matrix[i][j] is equal to 0, we start searching on the line of of i for values that are not 0 
     { 
      while(j<m) 
      { 
       if(a[i][j+1]!=0) //if matrix[i][j+1] has not been visited before, we add it to the solution, set it to zero and exit the while 
       { 
        solution[index]= a[i][j+1]; 
        a[i][j+1]=0; 
        index++; 
        j=m; //exit the while 


       } 
       else 
        j++; //keep searching for a value on that line 
      } 
     } 
    } 

    for(int i=1;i<=m*n;i++)//print the list with random values 
     g<<solution[i]<<" "; 

} 


int main() 
{ 
    n=10;//or read the values from stack2.in using f>>n>>m 
    m=10;//in the file should be written on the same line, number of lines and columens of the matrix eg.: 5 7 
    build(n,m); 
    solve(); 
    return 0; 
} 
+1

Я решил использовать этот код –

+0

, вы можете установить его как решение :) –