class_docstr: .. versionadded:: 2016.2
  
  .. automethod:: fill_uniform
  .. automethod:: uniform
  .. automethod:: fill_normal
  .. automethod:: normal
class_docstr_tok: ["..","versionadded",":",":","2016.2","..","automethod",":",":","fill_uniform","..","automethod",":",":","uniform","..","automethod",":",":","fill_normal","..","automethod",":",":","normal"]
code: def __init__(self, context, key=None, counter=None, seed=None):
      int32_info = np.iinfo(np.int32)
      from random import Random
  
      rng = Random(seed)
  
      if key is not None and counter is not None and seed is not None:
          raise TypeError(
              "seed is unused and may not be specified "
              "if both counter and key are given"
          )
  
      if key is None:
          key = [
              rng.randrange(
                  int(int32_info.min), int(int32_info.max) + 1
              )
              for i in range(self.key_length - 1)
          ]
      if counter is None:
          counter = [
              rng.randrange(
                  int(int32_info.min), int(int32_info.max) + 1
              )
              for i in range(4)
          ]
  
      self.context = context
      self.key = key
      self.counter = counter
  
      self.counter_max = int32_info.max
  
imports: import pyopencl
  import pyopencl.array
  import pyopencl.cltypes
  from pyopencl.tools import first_arg_dependent_memoize
  from pytools import memoize_method
  import numpy
label_desc: Use image node_id 4 to create a new Random123GeneratorBase object  with example: obj = Random123GeneratorBase(context, key, counter, seed)