Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.
В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:
rb = GetComponent<Rigidbody>();
. Эта строка кода работает лучше всего под ваши функции Start()
или Awake()
. rb = AddComponent<RigidBody>();
Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))]
над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!
Не встроен, но алгоритм R(3.4.2)
(«Резервуарный алгоритм Уотермана») из «Искусство компьютерного программирования» Кнута хорош (в очень упрощенной версии):
import random
def random_line(afile):
line = next(afile)
for num, aline in enumerate(afile):
if random.randrange(num + 2): continue
line = aline
return line
num + 2
создает последовательность 2, 3, 4 ... Таким образом, randrange
будет 0 с вероятностью 1.0/(num + 2)
- и это вероятность, с которой мы должны заменить выбранную в данный момент линию (особый случай размер выборки 1 ссылочного алгоритма - см. книгу Кнута для доказательства корректности ==, и, конечно же, мы также имеем дело с достаточно маленьким «резервуаром» для размещения в памяти; -) ... и точно вероятность с которым мы делаем так.
Это зависит от того, что вы подразумеваете под «слишком большими» накладными расходами. Если сохранить весь файл в памяти, возможно, что-то вроде
import random
random_lines = random.choice(open("file").readlines())
выполнит трюк.
Вы можете добавить строки в набор (), который будет произвольно изменять их порядок.
filename=open("lines.txt",'r')
f=set(filename.readlines())
filename.close()
Чтобы найти 1-ю строку:
print(next(iter(f)))
Чтобы найти 3-й line:
print(list(f)[2])
Чтобы перечислить все строки в наборе:
for line in f:
print(line)
import random
with open("file.txt", "r") as f:
lines = f.readlines()
print (random.choice(lines))
Если вы не хотите читать весь файл, вы можете искать его в середине файла, затем искать назад для новой строки и вызывать readline
.
Вот Python3 скрипт, который делает именно это,
. Одним из недостатков этого метода является то, что короткие линии имеют более низкое вероятность появления.
def read_random_line(f, chunk_size=16):
import os
import random
with open(f, 'rb') as f_handle:
f_handle.seek(0, os.SEEK_END)
size = f_handle.tell()
i = random.randint(0, size)
while True:
i -= chunk_size
if i < 0:
chunk_size += i
i = 0
f_handle.seek(i, os.SEEK_SET)
chunk = f_handle.read(chunk_size)
i_newline = chunk.rfind(b'\n')
if i_newline != -1:
i += i_newline + 1
break
if i == 0:
break
f_handle.seek(i, os.SEEK_SET)
return f_handle.readline()
Ищите случайную позицию, читайте строку и отбрасывайте ее, затем читайте другую строку. Распределение линий не будет нормальным, но это не всегда имеет значение.
Хотя я опаздываю на четыре года, я думаю, что у меня есть самое быстрое решение. Недавно я написал пакет python под названием linereader , который позволяет вам манипулировать указателями дескрипторов файлов.
Вот простое решение для получения случайной строки с этим пакетом:
from random import randint
from linereader import dopen
length = #lines in file
filename = #directory of file
file = dopen(filename)
random_line = file.getline(randint(1, length))
В первый раз это делается хуже всего, так как linereader должен скомпилировать выходной файл в специальном формате. После этого linereader может получить доступ к любой строке из файла быстро, независимо от размера файла.
Если ваш файл очень маленький (достаточно маленький, чтобы вписаться в MB), вы можете заменить dopen
с copen
, и он делает кэшированную запись файла в памяти. Это происходит не только быстрее, но вы получаете количество строк в файле, поскольку оно загружается в память; это делается для вас. Все, что вам нужно сделать, это создать случайный номер строки. Вот пример кода для этого.
from random import randint
from linereader import copen
file = copen(filename)
lines = file.count('\n')
random_line = file.getline(randint(1, lines))
Я просто очень рад, потому что увидел кого-то, кто мог бы воспользоваться моим пакетом! Извините за мертвый ответ, но пакет определенно может быть применен ко многим другим проблемам.
Это может быть громоздким, но это работает, я думаю? (по крайней мере, для txt-файлов)
import random
choicefile=open("yourfile.txt","r")
linelist=[]
for line in choicefile:
linelist.append(line)
choice=random.choice(linelist)
print(choice)
Он считывает каждую строку файла и добавляет его в список. Затем он выбирает случайную строку из списка. Если вы хотите удалить строку после ее выбора, просто сделайте
linelist.remove(choice)
. Надеюсь, что это может помочь, но, по крайней мере, никаких дополнительных модулей и импорта (кроме случайных) и относительно легкого.
import random
lines = open('file.txt').read().splitlines()
myline =random.choice(lines)
print(myline)
Для очень длинного файла: найдите случайное место в файле на основе его длины и найдите два символа новой строки после позиции (или новой строки и конца файла). Повторите 100 символов до или с начала файла, если исходная позиция поиска была & lt; 100, если мы оказались внутри последней строки.
Однако это сложнее, так как файл является итератором. возьмите random.choice (если вам нужно много, используйте random.sample):
import random
print(random.choice(list(open('file.txt'))))