code: def normal(nmr_distributions, nmr_samples, mean=0, std=1, ctype='float', seed=None):
      
      if is_scalar(mean):
          mean = np.ones((nmr_distributions, 1)) * mean
      if is_scalar(std):
          std = np.ones((nmr_distributions, 1)) * std
  
      kernel_data = {'mean': Array(mean, as_scalar=True),
                     'std': Array(std, as_scalar=True)}
  
      kernel = SimpleCLFunction.from_string('''
          void compute(double mean, double std, global uint* rng_state, global ''' + ctype + '''* samples){
              rand123_data rand123_rng_data = rand123_initialize_data((uint[]){
                  rng_state[0], rng_state[1], rng_state[2], rng_state[3], 
                  rng_state[4], rng_state[5], 0});
              void* rng_data = (void*)&rand123_rng_data;
  
              for(uint i = 0; i < ''' + str(nmr_samples) + '''; i++){
                  double4 randomnr = randn4(rng_data);
                  samples[i] = (''' + ctype + ''')(mean + randomnr.x * std);
              }
          }
      ''', dependencies=[Rand123()])
  
      return _generate_samples(kernel, nmr_distributions, nmr_samples, ctype, kernel_data, seed=seed)
docs: Draw random samples from the Gaussian distribution.
  
      Args:
          nmr_distributions (int): the number of unique continuous_distributions to create
          nmr_samples (int): The number of samples to draw
          mean (float or ndarray): The mean of the distribution
          std (float or ndarray): The standard deviation or the distribution
          ctype (str): the C type of the output samples
          seed (float): the seed for the RNG
  
      Returns:
          ndarray: A two dimensional numpy array as (nmr_distributions, nmr_samples).