blob: 51b0cdbb9854de495e34eb4266fe020281e5d098 [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:unified_analytics/src/utils.dart';
/// The purpose of this example file is to demonstrate the sampling
/// rate functionality from the survey handler.
///
/// It defines a `remoteUniqueId` that subs in for a real survey's unique
/// ID that is hosted in the remote json file.
///
/// Begin the simulation by setting the `testSampleRate` and `iterations`
/// variables, where `iterations` simulates real users and `testSampleRate`
/// represents a fraction of how many people should be sampled.
///
/// In this example, we have set the `testSampleRate` to `0.3`, meaning we want
/// sample 30% of users, and `iterations` to `10,000`, which simulates `10,000`
/// users.
///
/// Running the script with predefined seed of `123` will
/// generate the below `stdout`
/// ```
/// Test sample rate = 0.3
/// Number of iterations = 10000
/// ---
///
/// Count of iterations sampled (successes) = 3046
/// Actual sample rate = 0.3046
/// ---
///
/// Runtime = 8ms
/// ```
///
/// The actual results yielded 3,046 people selected for a rate
/// of `30.46%` which is about the `30%` defined in `testSampleRate`.
void main() {
// Seed has been set to replicate results
//
// Test with your own seed and alter other parameters
// as needed
final uuidGenerator = Uuid(123);
// Randomly generate an ID that will simulate being used for
// a given survey
final remoteUniqueId = uuidGenerator.generateV4();
// Define a sampling rate that we would like to test
//
// Setting 0.3 means any generated doubles less than or
// equal to 0.3 results in a survey getting delievered
const testSampleRate = 0.3;
// Define how many iterations to run, each iteration can
// be thought of as a developer using a dash tool
const iterations = 10000;
// Initializing a counter that will count the number of
// iterations that were below the sampling rate
var count = 0;
final start = DateTime.now();
for (var i = 0; i < iterations; i++) {
// Each newly generated ID is simulating a unique
// developer's CLIENT ID that is persisted on their disk
final clientId = uuidGenerator.generateV4();
// Generate a double that will be compared against the sampleRate
final generatedDouble = sampleRate(remoteUniqueId, clientId);
// Count successes if the generated double is less than our
// testing sample rate
if (generatedDouble <= testSampleRate) {
count++;
}
}
final end = DateTime.now();
print('''
Test sample rate = $testSampleRate
Number of iterations = $iterations
---
Count of iterations sampled (successes) = $count
Actual sample rate = ${(count / iterations).toStringAsFixed(4)}
---
Runtime = ${end.difference(start).inMilliseconds}ms
''');
}