xref: /aosp_15_r20/external/rappor/client/cpp/libc_rand_impl.cc (revision 2abb31345f6c95944768b5222a9a5ed3fc68cc00)
1 // Copyright 2015 Google Inc. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // IMPORTANT: This is for demo /simulation purposes only.  Use a better random
16 // function in production applications.
17 
18 #include "libc_rand_impl.h"
19 
20 #include <assert.h>
21 #include <stdint.h>  // uint64_t
22 #include <stdlib.h>  // srand
23 
24 namespace rappor {
25 
26 //
27 // LibcRand
28 //
29 
30 // Similar to client/python/fastrand.c
GetMask(float prob,int num_bits,Bits * mask_out) const31 bool LibcRand::GetMask(float prob, int num_bits, Bits* mask_out) const {
32   int rand_threshold = static_cast<int>(prob * RAND_MAX);
33   Bits mask = 0;
34 
35   for (int i = 0; i < num_bits; ++i) {
36     // NOTE: could use rand_r(), which is more thread-safe
37     Bits bit = (rand() < rand_threshold);
38     mask |= (bit << i);
39   }
40   *mask_out = mask;
41   return true;  // no possible failure
42 }
43 
44 }  // namespace rappor
45