Состояние генератора случайных чисел не всегда является просто семенем. Например, безопасный PRNG обычно имеет энтропийный буфер, который представляет собой больший блок данных.
Однако вы можете сохранить и восстановить все состояние генератора числа рандов, чтобы вы могли воспроизвести его результаты позже::
import random old_state = random.getstate () print random.random () random.setstate (old_state) print random.random () # Вы также можете восстановить состояние в свои собственные экземпляр PRNG, чтобы избежать проблем с потоковой безопасностью при использовании глобального экземпляра по умолчанию. prng = random.Random () prng.setstate (old_state) print prng.random ()
Результаты getstate
можно, конечно, мариновать, если вы хочу сохранить его настойчиво.
Вы производите Graphics2D
в контекст Graphics
g
. Подробнее о кастинге здесь, в Inheritance в разделе Casting.
Что это в конечном итоге делает, это использовать доступные методы Graphics2D
с контекстом Graphics
пройденного к методу paintComponent
. Если вы производите кастинг, вы будете ограничены только методами класса Graphics
Graphics2D
является подклассом Graphics
, поэтому с помощью Graphics2D
вы получите все методы Graphics
, используя методы в классе Graphics2D
.
Боковые заметки
paint
. Также, если вы, вы не должны рисовать на контейнерах верхнего уровня, таких как JApplet
. JPanel
или JComponent
и переопределите paintComponent
вместо paint
и вызовите super.paintComponent
. Затем просто добавьте JPanel
в родительский контейнер. public DrawPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
}
}
См. больше в Пользовательская живопись и Graphics2D
Да, вы должны включить g
.
Когда вы вводите свой метод рисования, у вас есть объект g
типа Graphics
.
Затем вы присваиваете свой объект Graphics
, g
типу Graphics2D
, который является типом, который расширяет Graphics
.
Вы должны включить g
, чтобы у вас было что-то типа. Если вы не включаете объект, вы получите ошибку компиляции, потому что оператор не является полным.
Причина, по которой вы приписываете g
объекту Graphics2D
, заключается в том, что вы сообщаете компилятору: «Этот графический объект на самом деле является объектом Graphics2D». таким образом, вы можете выполнять функции, которые объект Graphics2D
имеет, что объект Graphics
не делает.
Этот ответ stackoverflow answer очень хорошо объясняет отличные переменные в Java, если у вас есть больше вопросов об этом. И этот ответ stackoverflow answer объясняет, почему безопасно передавать из Graphics
в Graphics2D