// 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 '''); }