code: def test_random_gen(self, device, dtype):
      torch.manual_seed(42)
      angle = torch.tensor(
          [(10, 30), (30, 60), (60, 90)], device=device, dtype=dtype
      )
      direction = torch.tensor([-1, 1], device=device, dtype=dtype)
      param_gen = MotionBlurGenerator3D(
          kernel_size=3, angle=angle, direction=direction
      )
  
      res = param_gen(batch_shape=torch.Size((2,)), same_on_batch=False)
  
      expected = {
          "ksize_factor": torch.tensor(
              [3, 3], device=device, dtype=torch.int32
          ),
          "angle_factor": torch.tensor(
              [
                  [27.6454, 41.4859, 71.7134],
                  [28.3001, 58.7792, 78.0269],
              ],
              device=device,
              dtype=dtype,
          ),
          "direction_factor": torch.tensor(
              [-0.4869, 0.5873], device=device, dtype=dtype
          ),
      }
      assert res.keys() == expected.keys()
      assert_close(
          res["ksize_factor"],
          expected["ksize_factor"],
          rtol=1e-4,
          atol=1e-4,
      )
      assert_close(
          res["angle_factor"],
          expected["angle_factor"],
          rtol=1e-4,
          atol=1e-4,
      )
      assert_close(
          res["direction_factor"],
          expected["direction_factor"],
          rtol=1e-4,
          atol=1e-4,
      )
  
imports: import pytest
  import torch
  from kornia.augmentation.random_generator import AffineGenerator3D, CropGenerator3D, MotionBlurGenerator3D, PerspectiveGenerator3D, RotationGenerator3D, center_crop_generator3d
  from kornia.testing import assert_close
label_desc: Use image node_id 3 for calling the TestRandomMotionBlur3D obj's underlying member method code with example usage: obj.test_random_gen(device, dtype) without return types