diff --git a/oneflow/api/python/framework/random_generator.cpp b/oneflow/api/python/framework/random_generator.cpp
index bded13ecf4a5f159b32ff280c5c27fd545480a5f..31d12bb9ad60e62c332612f20af1b743bc853f74 100644
--- a/oneflow/api/python/framework/random_generator.cpp
+++ b/oneflow/api/python/framework/random_generator.cpp
@@ -26,7 +26,8 @@ namespace oneflow {
 ONEFLOW_API_PYBIND11_MODULE("", m) {
   py::class_<one::Generator, std::shared_ptr<one::Generator>>(m, "Generator")
       .def("manual_seed", &one::Generator::set_current_seed)
-      .def("initial_seed", &one::Generator::current_seed);
+      .def("initial_seed", &one::Generator::current_seed)
+      .def("seed", &one::Generator::seed);
 
   m.def("manual_seed", [](uint64_t seed) { return one::ManualSeed(seed).GetOrThrow(); });
   m.def("create_generator", [](const std::string& device_tag) {
diff --git a/oneflow/core/framework/random_generator.h b/oneflow/core/framework/random_generator.h
index c7074c27edc647f658cc440667a429f91835334c..3e6ae9f9c48363bf502addcb9568e50f354cfa77 100644
--- a/oneflow/core/framework/random_generator.h
+++ b/oneflow/core/framework/random_generator.h
@@ -36,7 +36,7 @@ class Generator final {
 
   uint64_t current_seed() const;
 
-  // Reset current seed by default seed, and returns it.
+  // Reset current generator by a non-deterministic random seed, and returns it.
   uint64_t seed();
 
   const std::shared_ptr<GeneratorImpl>& impl() const { return impl_; }
diff --git a/oneflow/core/framework/random_generator_impl.h b/oneflow/core/framework/random_generator_impl.h
index e53abc59a9fa651693ed643b96dd6484e14013f6..666e57e119ea798e43d3d2439e4c3279f994ea71 100644
--- a/oneflow/core/framework/random_generator_impl.h
+++ b/oneflow/core/framework/random_generator_impl.h
@@ -94,7 +94,6 @@ class CPUGeneratorImpl : public DeviceGeneratorImpl {
   }
 
   std::mt19937& engine() { return engine_; }
-  void set_engine(std::mt19937 engine) { engine_ = engine; }
 
  public:
   std::mt19937 engine_;
diff --git a/oneflow/python/test/generator/test_generator.py b/oneflow/python/test/generator/test_generator.py
index b61bced5a1cb0f42d272aab92af8a83df18abf95..94294360edea0c8a47b23f0a5153947c7c556343 100644
--- a/oneflow/python/test/generator/test_generator.py
+++ b/oneflow/python/test/generator/test_generator.py
@@ -44,19 +44,16 @@ class TestDefaultGenerator(flow.unittest.TestCase):
         cuda_gen = flow.default_generator(device="cuda")
         cuda0_gen = flow.default_generator(device="cuda:0")
         cpu_gen = flow.default_generator(device="cpu")
-        test_case.assertTrue(auto_gen.initial_seed() == global_seed)
-        test_case.assertTrue(cuda_gen.initial_seed() == global_seed)
-        test_case.assertTrue(cuda0_gen.initial_seed() == global_seed)
-        test_case.assertTrue(cpu_gen.initial_seed() == global_seed)
+        for gen in [auto_gen, cuda_gen, cuda0_gen, cpu_gen]:
+            test_case.assertTrue(gen.initial_seed() == global_seed)
 
     def test_different_devices(test_case):
         auto_gen = flow.default_generator(device="auto")
         cuda_gen = flow.default_generator(device="cuda")
         cuda0_gen = flow.default_generator(device="cuda:0")
         cpu_gen = flow.default_generator(device="cpu")
-        test_case.assertTrue(auto_gen.initial_seed() == cuda_gen.initial_seed())
-        test_case.assertTrue(auto_gen.initial_seed() == cuda0_gen.initial_seed())
-        test_case.assertTrue(auto_gen.initial_seed() == cpu_gen.initial_seed())
+        for gen in [cuda_gen, cuda0_gen, cpu_gen]:
+            test_case.assertTrue(auto_gen.initial_seed() == gen.initial_seed())
 
         with test_case.assertRaises(Exception) as context:
             flow.default_generator(device="invalid")
@@ -75,15 +72,19 @@ class TestDefaultGenerator(flow.unittest.TestCase):
         cuda_gen = flow.default_generator(device="cuda")
         cpu_gen = flow.default_generator(device="cpu")
 
-        auto_gen.manual_seed(1)
-        test_case.assertTrue(auto_gen.initial_seed() == 1)
-        test_case.assertTrue(cpu_gen.initial_seed() == 1)
-        test_case.assertTrue(cuda_gen.initial_seed() == 1)
+        for seed in [1, 2]:
+            auto_gen.manual_seed(seed)
+            for gen in [auto_gen, cuda_gen, cpu_gen]:
+                test_case.assertTrue(gen.initial_seed() == seed)
 
-        auto_gen.manual_seed(2)
-        test_case.assertTrue(auto_gen.initial_seed() == 2)
-        test_case.assertTrue(cuda_gen.initial_seed() == 2)
-        test_case.assertTrue(cpu_gen.initial_seed() == 2)
+    def test_generator_seed(test_case):
+        auto_gen = flow.default_generator(device="auto")
+        cuda_gen = flow.default_generator(device="cuda")
+        cpu_gen = flow.default_generator(device="cpu")
+
+        for gen in [auto_gen, cuda_gen, cpu_gen]:
+            seed = gen.seed()
+            test_case.assertTrue(seed == gen.initial_seed())
 
 
 if __name__ == "__main__":
diff --git a/oneflow/python/test/modules/test_bernoulli.py b/oneflow/python/test/modules/test_bernoulli.py
index 8b80cfa50c3b8e910d4d65a4dacf466aecbbdb16..30eed8270d2e1dd75ee34ad6455633894a729580 100644
--- a/oneflow/python/test/modules/test_bernoulli.py
+++ b/oneflow/python/test/modules/test_bernoulli.py
@@ -29,6 +29,17 @@ def _test_bernoulli(test_case, shape):
     test_case.assertTrue(np.allclose(y.numpy(), x.numpy()))
 
 
+def _test_bernoulli_with_generator(test_case, shape):
+    generator = flow.Generator()
+    generator.manual_seed(0)
+    x = flow.Tensor(np.random.rand(*shape), device=flow.device("cpu"))
+    y_1 = flow.bernoulli(x, generator=generator)
+    y_1.numpy()  # sync
+    generator.manual_seed(0)
+    y_2 = flow.bernoulli(x, generator=generator)
+    test_case.assertTrue(np.allclose(y_1.numpy(), y_2.numpy()))
+
+
 @unittest.skipIf(
     not flow.unittest.env.eager_execution_enabled(),
     ".numpy() doesn't work in lazy mode",
diff --git a/oneflow/python/test/modules/test_dropout.py b/oneflow/python/test/modules/test_dropout.py
index 7f279cd2b69c7521e03ae3b4f56ad97439dcc701..2029ffb6a0a081cd5732c41e658304beb4f47065 100644
--- a/oneflow/python/test/modules/test_dropout.py
+++ b/oneflow/python/test/modules/test_dropout.py
@@ -77,6 +77,18 @@ def _test_dropout_eval(test_case, shape, device):
     test_case.assertTrue(np.allclose(y.numpy(), input_arr))
 
 
+def _test_dropout_with_generator(test_case, shape, device):
+    generator = flow.Generator()
+    generator.manual_seed(0)
+    m = flow.nn.Dropout(p=0.5, generator=generator)
+    x = flow.Tensor(np.random.randn(*shape), device=flow.device(device))
+    y_1 = m(x)
+    y_1.numpy()  # sync
+    generator.manual_seed(0)
+    y_2 = m(x)
+    test_case.assertTrue(np.allclose(y_1.numpy(), y_2.numpy()))
+
+
 @unittest.skipIf(
     not flow.unittest.env.eager_execution_enabled(),
     ".numpy() doesn't work in lazy mode",
@@ -90,6 +102,7 @@ class TestDropout(flow.unittest.TestCase):
             _test_dropout_backward_p0,
             _test_dropout_backward_p1,
             _test_dropout_eval,
+            _test_dropout_with_generator,
         ]
         arg_dict["shape"] = [(2, 3), (2, 3, 4), (2, 3, 4, 5)]
         arg_dict["device"] = ["cpu", "cuda"]