[在此输入图像描述][1]
如何创建一个10*10的矩阵,生成随机的字母,只使用一次,并且永远不超出矩阵。我知道我的while循环和底部的for语句是困扰我的原因?我也想在while循环中找到x和y的值。应该像上图那样?
import random
N = 10
FILLER = '.'
line = []
for i in range(N):
line.append(FILLER)
a=[]
for i in range (N):
line = line[:]
a.append(line)
x = 0
y = 0
letter = 'A'
a[x][y] = letter
letter = chr(ord(letter) + 1)
while (letter <= 'Z'):
x =
y =
if (a[x][y] == FILLER):
for i in range(N):
print(' '.join(a[i]))
[1]: https://i.stack.imgur.com/9ZRvW.png
我没有研究过你的代码,但如果你想要一个10x10矩阵,包含EN语言的随机字母(不重复任何字母),你可以使用下面的代码。
import numpy as np
import string
import random
alpha=list(string.ascii_uppercase)
a=[]
for x in range(100):
choice=random.choice(alpha)
if choice in a:
a.append('.')
else:
a.append(choice)
arr=np.array(a)
res_arr=arr.reshape([10,10])
print(res_arr)
输出。
[['S' 'B' 'N' 'P' '.' 'A' 'G' 'O' '.' 'I']
['U' 'Z' 'F' '.' 'Q' '.' 'K' 'C' 'H' 'X']
['L' '.' '.' 'E' 'T' '.' 'M' '.' 'J' 'V']
['.' '.' '.' '.' '.' '.' '.' '.' '.' 'Y']
['.' '.' '.' '.' '.' '.' '.' '.' '.' '.']
['.' 'R' '.' '.' '.' '.' '.' '.' '.' '.']
['.' '.' '.' '.' '.' '.' '.' '.' '.' '.']
['.' '.' '.' '.' '.' '.' '.' '.' '.' '.']
['.' '.' '.' '.' '.' 'D' '.' '.' '.' '.']
['.' '.' '.' '.' '.' '.' '.' '.' '.' '.']]
有几件事要注意
1)我还没有在矩阵中加入种子 random
. 如果你想每次都生成相同的矩阵,你可以这样做,做那个用途。
random.seed(10) #replace 10 with integer of your choice (use this after generating alpha)
2)我留下了 res
作为一个numpy数组。如果你想把它作为列表,则使用:
res_arr=arr.reshape([10,10]).tolist() #replace this with the res_arr declaration in the above code
from random import choice
from pprint import pprint
from string import ascii_lowercase as lc
def arr_gen():
return [[choice(lc+len(lc)*".") for _ in range(10)] for _ in range(10)]
pprint(arr_gen())
OUTPUT
[['d', '.', 'v', 'h', 'n', '.', 'c', '.', '.', 'i'],
['d', '.', '.', 'x', 'q', '.', 'v', '.', 'k', 'k'],
['.', 'f', '.', '.', '.', '.', '.', 'g', '.', '.'],
['i', '.', 'q', 'b', '.', '.', 'n', '.', 'z', 'b'],
['e', '.', 'y', '.', 'h', 'e', 'v', 'h', '.', 'h'],
['i', 'x', '.', '.', 'k', '.', '.', 'd', '.', 'o'],
['j', '.', '.', 'q', 'v', '.', '.', 'j', '.', '.'],
['.', '.', '.', 'v', 'v', 'l', '.', '.', '.', '.'],
['.', 'f', '.', 'x', 'g', '.', 'u', 'i', '.', '.'],
['p', 'e', '.', 'l', '.', '.', 'l', 'h', 'i', '.']]
没有什么高明之处,一步一步来,确保我们可以调整矩阵的大小,还能用。
from string import ascii_uppercase as letters
from random import randrange
SIZE = 10
EMPTY = ' '
matrix = [[EMPTY for _ in range(SIZE)] for _ in range(SIZE)]
for letter in letters[:min(SIZE ** 2, len(letters))]: # in case we're using a tiny matrix
while True:
x, y = randrange(0, SIZE), randrange(0, SIZE)
if matrix[x][y] == EMPTY: # don't over write existing letter
matrix[x][y] = letter
break
print(*matrix, sep='\n')
OUTPUT
> python3 test.py
['X', ' ', ' ', ' ', ' ', ' ', ' ', 'Y', ' ', ' ']
[' ', ' ', 'J', ' ', ' ', 'E', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', 'I', ' ', ' ', 'N']
[' ', ' ', ' ', 'S', ' ', 'B', 'F', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', 'Q', ' ', ' ', ' ', ' ']
['A', 'M', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', 'C', 'D', ' ', ' ', ' ', ' ', 'T']
['U', ' ', ' ', ' ', 'R', ' ', ' ', 'K', ' ', 'W']
[' ', ' ', 'V', ' ', 'L', ' ', ' ', ' ', 'H', 'P']
[' ', ' ', 'Z', 'O', ' ', ' ', ' ', ' ', ' ', 'G']
>
您可以使用 shuffle()
来自 random
模块:
from random import shuffle
import numpy as np
l = [n for n in range(65,91)]+[46 for n in range(74)]
shuffle(l)
print([[chr(a) for a in i] for i in np.reshape(l,(10,10))])
输出:
[['L', 'Q', '.', '.', '.', '.', 'V', '.', '.', '.'],
['K', '.', 'N', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', 'F', '.', '.', '.', '.', '.', '.', '.'],
['S', '.', '.', '.', '.', '.', '.', '.', '.', 'X'],
['.', '.', '.', '.', '.', '.', '.', 'M', '.', '.'],
['.', 'D', '.', '.', 'T', '.', '.', 'J', 'P', '.'],
['I', '.', 'Z', '.', 'B', '.', '.', 'H', '.', '.'],
['.', '.', 'C', 'U', '.', '.', '.', '.', '.', '.'],
['O', '.', '.', '.', '.', '.', '.', '.', 'E', 'A'],
['R', '.', '.', 'Y', '.', 'G', 'W', '.', '.', '.']]
EXTRA:
这看起来更好:)
from random import shuffle
import numpy as np
l = [n for n in range(65,91)]+[46 for n in range(74)]
shuffle(l)
for i in np.reshape(l,(10,10)):
print(' '.join([chr(a) for a in i]))
Output: EXTRA: This look nicer :)
. . . . O N X F . .
. . . C . T K . W .
. . . . . . . . . .
. . . Z . V . . . .
. M . . E . A S . .
J P . . H . . . R .
. Q . . . . . . . .
. G . . . I . . B D
. . . L Y . . . . .
U . . . . . . . . .