1/*
2 This file is part of the KDE libraries
3
4 SPDX-FileCopyrightText: 1999 Matthias Kalle Dalheimer <kalle@kde.org>
5 SPDX-FileCopyrightText: 2000 Charles Samuels <charles@kde.org>
6 SPDX-FileCopyrightText: 2005 Joseph Wenninger <kde@jowenn.at>
7
8 SPDX-License-Identifier: LGPL-2.0-or-later
9*/
10
11#ifndef KRANDOM_H
12#define KRANDOM_H
13
14#include <kcoreaddons_export.h>
15
16#include <QRandomGenerator>
17#include <QString>
18
19#include <limits>
20
21/*!
22 * \namespace KRandom
23 * \inmodule KCoreAddons
24 *
25 * \brief Helper to create random data.
26 *
27 * This namespace provides methods which generate random data.
28 * KRandom is not recommended for serious random-number generation needs,
29 * like cryptography.
30 */
31namespace KRandom
32{
33/*!
34 * Generates a random string. It operates in the range [A-Za-z0-9]
35 *
36 * \a length Generate a string of this length.
37 *
38 * Returns the random string
39 */
40KCOREADDONS_EXPORT QString randomString(int length);
41
42/*!
43 * Reorders the elements of the given container randomly using the given random number generator.
44 *
45 * The container needs to implement size() and T &operator[]
46 *
47 * \since 5.73
48 */
49template<typename T>
50void shuffle(T &container, QRandomGenerator *generator)
51{
52 Q_ASSERT(container.size() <= std::numeric_limits<int>::max());
53 // Fisher-Yates algorithm
54 for (int index = container.size() - 1; index > 0; --index) {
55 const int swapIndex = generator->bounded(highest: index + 1);
56 qSwap(container[index], container[swapIndex]);
57 }
58}
59
60/*!
61 * Reorders the elements of the given container randomly.
62 *
63 * The container needs to implement size() and T &operator[]
64 *
65 * \since 5.73
66 */
67template<typename T>
68void shuffle(T &container)
69{
70 shuffle(container, QRandomGenerator::global());
71}
72
73}
74
75#endif
76

source code of kcoreaddons/src/lib/randomness/krandom.h