We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Access to the Generator.random
It would be nice if one could gain access to the Generator.random variable so that one could save/set the state.  I realize I can pass in the seed, but one currently has no way of gathering what the seed/state is if using the automatically generated seed.  I don't want to use a fixed seed, but I do want to log/print the seed used _if_ the tests fail.

That is, I'd like to be able to do something like:  `faker.generator.getstate()` (which gets the random state w/o exposing random) or `faker.generator.random.getstate()` (which gives access to the random variable)

For now, the workaround appears to be to create a Faker object with your own Generator.


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `faker/generator.py`
Content:
```
1 # coding=utf-8
2 
3 from __future__ import unicode_literals
4 
5 import re
6 import random
7 
8 
9 _re_token = re.compile(r'\{\{(\s?)(\w+)(\s?)\}\}')
10 random = random.Random()
11 
12 
13 class Generator(object):
14 
15     __config = {}
16 
17     def __init__(self, **config):
18         self.providers = []
19         self.__config = dict(
20             list(self.__config.items()) + list(config.items()))
21 
22     def add_provider(self, provider):
23 
24         if type(provider) is type:
25             provider = provider(self)
26 
27         self.providers.insert(0, provider)
28 
29         for method_name in dir(provider):
30             # skip 'private' method
31             if method_name.startswith('_'):
32                 continue
33 
34             faker_function = getattr(provider, method_name)
35 
36             if hasattr(faker_function, '__call__') or \
37                     isinstance(faker_function, (classmethod, staticmethod)):
38                 # add all faker method to generator
39                 self.set_formatter(method_name, faker_function)
40 
41     def provider(self, name):
42         try:
43             lst = [p for p in self.get_providers()
44                    if p.__provider__ == name.lower()]
45             return lst[0]
46         except IndexError:
47             return None
48 
49     def get_providers(self):
50         """Returns added providers."""
51         return self.providers
52 
53     def seed(self, seed=None):
54         """Calls random.seed"""
55         random.seed(seed)
56 
57     def format(self, formatter, *args, **kwargs):
58         """
59         This is a secure way to make a fake from another Provider.
60         """
61         # TODO: data export?
62         return self.get_formatter(formatter)(*args, **kwargs)
63 
64     def get_formatter(self, formatter):
65         try:
66             return getattr(self, formatter)
67         except AttributeError:
68             raise AttributeError('Unknown formatter "{0}"'.format(formatter))
69 
70     def set_formatter(self, name, method):
71         """
72         This method adds a provider method to generator.
73         Override this method to add some decoration or logging stuff.
74         """
75         setattr(self, name, method)
76 
77     def parse(self, text):
78         """
79         Replaces tokens (like '{{ tokenName }}' or '{{tokenName}}')
80         with the result from the token method call.
81         """
82         return _re_token.sub(self.__format_token, text)
83 
84     def __format_token(self, matches):
85         formatter = list(matches.groups())
86         formatter[1] = self.format(formatter[1])
87         return ''.join(formatter)
88
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/faker/generator.py b/faker/generator.py
--- a/faker/generator.py
+++ b/faker/generator.py
@@ -50,6 +50,10 @@
         """Returns added providers."""
         return self.providers
 
+    @property
+    def random(self):
+        return random
+
     def seed(self, seed=None):
         """Calls random.seed"""
         random.seed(seed)

{"golden_diff": "diff --git a/faker/generator.py b/faker/generator.py\n--- a/faker/generator.py\n+++ b/faker/generator.py\n@@ -50,6 +50,10 @@\n         \"\"\"Returns added providers.\"\"\"\n         return self.providers\n \n+    @property\n+    def random(self):\n+        return random\n+\n     def seed(self, seed=None):\n         \"\"\"Calls random.seed\"\"\"\n         random.seed(seed)\n", "issue": "Access to the Generator.random\nIt would be nice if one could gain access to the Generator.random variable so that one could save/set the state.  I realize I can pass in the seed, but one currently has no way of gathering what the seed/state is if using the automatically generated seed.  I don't want to use a fixed seed, but I do want to log/print the seed used _if_ the tests fail.\n\nThat is, I'd like to be able to do something like:  `faker.generator.getstate()` (which gets the random state w/o exposing random) or `faker.generator.random.getstate()` (which gives access to the random variable)\n\nFor now, the workaround appears to be to create a Faker object with your own Generator.\n\n", "before_files": [{"content": "# coding=utf-8\n\nfrom __future__ import unicode_literals\n\nimport re\nimport random\n\n\n_re_token = re.compile(r'\\{\\{(\\s?)(\\w+)(\\s?)\\}\\}')\nrandom = random.Random()\n\n\nclass Generator(object):\n\n    __config = {}\n\n    def __init__(self, **config):\n        self.providers = []\n        self.__config = dict(\n            list(self.__config.items()) + list(config.items()))\n\n    def add_provider(self, provider):\n\n        if type(provider) is type:\n            provider = provider(self)\n\n        self.providers.insert(0, provider)\n\n        for method_name in dir(provider):\n            # skip 'private' method\n            if method_name.startswith('_'):\n                continue\n\n            faker_function = getattr(provider, method_name)\n\n            if hasattr(faker_function, '__call__') or \\\n                    isinstance(faker_function, (classmethod, staticmethod)):\n                # add all faker method to generator\n                self.set_formatter(method_name, faker_function)\n\n    def provider(self, name):\n        try:\n            lst = [p for p in self.get_providers()\n                   if p.__provider__ == name.lower()]\n            return lst[0]\n        except IndexError:\n            return None\n\n    def get_providers(self):\n        \"\"\"Returns added providers.\"\"\"\n        return self.providers\n\n    def seed(self, seed=None):\n        \"\"\"Calls random.seed\"\"\"\n        random.seed(seed)\n\n    def format(self, formatter, *args, **kwargs):\n        \"\"\"\n        This is a secure way to make a fake from another Provider.\n        \"\"\"\n        # TODO: data export?\n        return self.get_formatter(formatter)(*args, **kwargs)\n\n    def get_formatter(self, formatter):\n        try:\n            return getattr(self, formatter)\n        except AttributeError:\n            raise AttributeError('Unknown formatter \"{0}\"'.format(formatter))\n\n    def set_formatter(self, name, method):\n        \"\"\"\n        This method adds a provider method to generator.\n        Override this method to add some decoration or logging stuff.\n        \"\"\"\n        setattr(self, name, method)\n\n    def parse(self, text):\n        \"\"\"\n        Replaces tokens (like '{{ tokenName }}' or '{{tokenName}}')\n        with the result from the token method call.\n        \"\"\"\n        return _re_token.sub(self.__format_token, text)\n\n    def __format_token(self, matches):\n        formatter = list(matches.groups())\n        formatter[1] = self.format(formatter[1])\n        return ''.join(formatter)\n", "path": "faker/generator.py"}], "after_files": [{"content": "# coding=utf-8\n\nfrom __future__ import unicode_literals\n\nimport re\nimport random\n\n\n_re_token = re.compile(r'\\{\\{(\\s?)(\\w+)(\\s?)\\}\\}')\nrandom = random.Random()\n\n\nclass Generator(object):\n\n    __config = {}\n\n    def __init__(self, **config):\n        self.providers = []\n        self.__config = dict(\n            list(self.__config.items()) + list(config.items()))\n\n    def add_provider(self, provider):\n\n        if type(provider) is type:\n            provider = provider(self)\n\n        self.providers.insert(0, provider)\n\n        for method_name in dir(provider):\n            # skip 'private' method\n            if method_name.startswith('_'):\n                continue\n\n            faker_function = getattr(provider, method_name)\n\n            if hasattr(faker_function, '__call__') or \\\n                    isinstance(faker_function, (classmethod, staticmethod)):\n                # add all faker method to generator\n                self.set_formatter(method_name, faker_function)\n\n    def provider(self, name):\n        try:\n            lst = [p for p in self.get_providers()\n                   if p.__provider__ == name.lower()]\n            return lst[0]\n        except IndexError:\n            return None\n\n    def get_providers(self):\n        \"\"\"Returns added providers.\"\"\"\n        return self.providers\n\n    @property\n    def random(self):\n        return random\n\n    def seed(self, seed=None):\n        \"\"\"Calls random.seed\"\"\"\n        random.seed(seed)\n\n    def format(self, formatter, *args, **kwargs):\n        \"\"\"\n        This is a secure way to make a fake from another Provider.\n        \"\"\"\n        # TODO: data export?\n        return self.get_formatter(formatter)(*args, **kwargs)\n\n    def get_formatter(self, formatter):\n        try:\n            return getattr(self, formatter)\n        except AttributeError:\n            raise AttributeError('Unknown formatter \"{0}\"'.format(formatter))\n\n    def set_formatter(self, name, method):\n        \"\"\"\n        This method adds a provider method to generator.\n        Override this method to add some decoration or logging stuff.\n        \"\"\"\n        setattr(self, name, method)\n\n    def parse(self, text):\n        \"\"\"\n        Replaces tokens (like '{{ tokenName }}' or '{{tokenName}}')\n        with the result from the token method call.\n        \"\"\"\n        return _re_token.sub(self.__format_token, text)\n\n    def __format_token(self, matches):\n        formatter = list(matches.groups())\n        formatter[1] = self.format(formatter[1])\n        return ''.join(formatter)\n", "path": "faker/generator.py"}]}