所以我要做的就是创建一个能够投掷2个骰子n次的函数。对于每次投掷,如果至少有一个骰子数是奇数,我们将返回该对值的总和,如果不是,我们只返回None。该程序的目标是返回一个矩阵,该矩阵有3列,n行代表每对掷骰子。第1列是第一个骰子的值,第2列是第二个骰子的值,第3列是1&的总和。 2或无。
这是我到目前为止的代码:
def dice(n):
rolls = np.empty(shape=(n,3))
for i in range(n):
x = random.randint(1,6)
y = random.randint(1,6)
if x or y == 1 or 3 or 5:
sum_2_dice = x + y
rolls.append(x,y,sum_2_dice)
if x and y != 1 or 3 or 5:
sum_2_dice = None
rolls.append(x,y,sum_2_dice)
return rolls
运行该函数不会给我带来任何问题,但是当我像dice(2)
我得到AttributeError: 'numpy.ndarray' object has no attribute 'append'
我认为我们必须从一个空的numpy矩阵开始,然后能够将它附加到for循环中以获得3列(for循环将重复n次,我们因此得到一个矩阵有n行3列)
我们只允许进入numpy和随机,顺便说一句。
答案 0 :(得分:1)
在创建正确大小的numpy数组时,不需要为其附加值。相反,您需要使用值填充数组。例如:
rolls = np.zeros(shape=(2, 3))
# [[ 0. 0. 0.]
# [ 0. 0. 0.]]
rolls[1,:] = 1,2,3
# [[ 0. 0. 0.]
# [ 1. 2. 3.]]
另一点需要注意的是,您的if
语句没有按照您的想法行事。有关详细说明,请参阅this问题。
因此,对于您的例子,您可能想要
def dice(n):
rolls = np.empty(shape=(n, 3))
for i in range(n):
x = random.randint(1,6)
y = random.randint(1,6)
if {x, y} & {1, 3, 5}: # Suggested by Elazar in the comments
# if x in [1,3,5] or y in [1,3,5]: # Another way to do it
sum_2_dice = x + y
rolls[i,:] = x, y, sum_2_dice
else:
sum_2_dice = 0
rolls[i,:] = x, y, sum_2_dice
return rolls
如果 要返回矩阵(我认为没有任何好处),您只需在返回值时将其转换为:
return np.matrix(rolls)
您可以通过执行以下操作来检查输出类型:
result = dice(2)
print (type(result))
# <class 'numpy.matrixlib.defmatrix.matrix'>