2015-11-15 5 views
0

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

def randSelect(self): 
    return self.matrix[random.randrange(len(self.matrix))] 

Вот полный код, а

class Matrix(): 
    def __init__(self, cols, rows): 
     self.cols = cols 
     self.rows = rows 

     self.matrix = [] 
     for i in range(rows): 
      selec_row = [] 
      for j in range(cols): 
       selec_row.append(0) 
      self.matrix.append(selec_row) 
    def setitem(self, col, row, v): 
     self.matrix[col-1][row-1] = v 

    def randSelect(self): 
     return self.matrix[random.randrange(len(self.matrix))] 

    def __repr__(self): 
     outStr = "" 
     for i in range(self.rows): 
      outStr += 'Row %s = %s\n' % (i+1, self.matrix[i]) 
     return outStr 

    a = Matrix(3,3) 
    a.setitem(1,2,10) 
    a.setitem(1,3,15) 
    a.setitem(2,1,10) 

ответ

2
def randSelect(self): 
    row = random.randrange(self.rows) 
    col = random.randrange(self.cols) 
    return self.matrix[row][col] 
+0

Thanks Furas это хорошо работает – DrakonianD

0

Ваша randselect функция должна получить доступ к self.matrix с двумя индексами. Это массив массивов, поэтому только с одним набором квадратных скобок вы возвращаете массив. Вам понадобится второй доступ, чтобы получить отдельный элемент.

def randSelect(self): 
    row = self.matrix[random.randrange(len(self.matrix))] 
    return row[random.randrange(len(row))] 
0

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

from random import randint 
    i = (randint(0,9)) #assuming your range for i is from 0-9 
    j = (randint(0,9)) #assuming your range for j is from 0-9 
1

Вот мое решение. Я использую namedtuple в качестве возврата, чтобы вы могли получить позицию этого значения.

import random 
from collections import namedtuple 

RandomValue = namedtuple("RandomValue", ("Value", "RowIndex", "ValueIndex")) 


class Matrix(): 
    def __init__(self, cols, rows): 
     self.cols = cols 
     self.rows = rows 

     self.matrix = [] 
     for i in range(rows): 
      selec_row = [] 
      for j in range(cols): 
       selec_row.append(0) 
      self.matrix.append(selec_row) 

    def setitem(self, col, row, v): 
     self.matrix[col - 1][row - 1] = v 

    def randSelect(self): 
     row = self.matrix[random.randrange(len(self.matrix))] 
     value = random.choice(row) 
     return RandomValue(value, self.matrix.index(row), row.index(value)) 

    def __repr__(self): 
     outStr = "" 
     for i in range(self.rows): 
      outStr += 'Row %s = %s\n' % (i + 1, self.matrix[i]) 
     return outStr 


a = Matrix(3, 3) 
a.setitem(1, 2, 10) 
a.setitem(1, 3, 15) 
a.setitem(2, 1, 10) 
print(random_val.RowIndex) 
print(random_val.ValueIndex) 
print(random_val.Value) 
+0

Спасибо electrometro. Я собираюсь попробовать это :) – DrakonianD

Смежные вопросы