import 'dart:math';
import 'dart:typed_data';

Random _generator() {
  try {
    return Random.secure();
  } catch (err) {
    return Random(DateTime.now().millisecondsSinceEpoch);
  }
}

/// Generate a list of random numbers of size [length]
Uint8List randomNumbers(
  int length, {
  int start = 0,
  int stop = 0xFFFFFFFF,
}) {
  var random = _generator();
  var data = Uint8List(length);
  for (int i = 0; i < data.length; i++) {
    data[i] = random.nextInt(stop - start + 1) + start;
  }
  return data;
}

/// Generate a list of random 8-bit numbers of size [length]
Uint8List randomBytes(int length) {
  return randomNumbers(length, stop: 0xFF);
}

/// Fill the [buffer] with random numbers
void fillRandom(
  ByteBuffer buffer, [
  int offsetInBytes = 0,
  int? lengthInBytes,
]) {
  if (lengthInBytes == null) {
    lengthInBytes = buffer.lengthInBytes;
  } else {
    lengthInBytes = min(lengthInBytes + offsetInBytes, buffer.lengthInBytes);
  }
  var random = _generator();
  var data = buffer.asUint8List();
  for (int i = offsetInBytes; i < lengthInBytes; i++) {
    data[i] = random.nextInt(256);
  }
}
