<commit_before>// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/common/rand_util.h"

#include <stdlib.h>
#include <time.h>

#include "base/logging.h"
#include "base/thread_local_storage.h"
#include "base/time.h"
#include "base/win_util.h"

namespace rand_util {

// TODO(evanm): don't rely on static initialization.
// Using TLS since srand() needs to be called once in each thread.
TLSSlot g_tls_index;

int RandInt(int min, int max) {
  if (g_tls_index.Get() == 0) {
    g_tls_index.Set(reinterpret_cast<void*>(1));
    TimeDelta now = TimeTicks::UnreliableHighResNow() - TimeTicks();
    unsigned int seed = static_cast<unsigned int>(now.InMicroseconds());
    srand(seed);
  }

  // From the rand man page, use this instead of just rand() % max, so that the
  // higher bits are used.
  return min + static_cast<int>(static_cast<double>(max - min + 1) *
    (::rand() / (RAND_MAX + 1.0)));
}

int RandIntSecure(int min, int max) {
  if (win_util::GetWinVersion() < win_util::WINVERSION_XP) {
    // rand_s needs XP and later.
    return RandInt(min, max);
  }

  unsigned int number;
  errno_t rv = rand_s(&number);
  DCHECK(rv == 0) << "rand_s failed with error " << rv;

  // From the rand man page, use this instead of just rand() % max, so that the
  // higher bits are used.
  return min + static_cast<int>(static_cast<double>(max - min + 1.0) *
      (number / (UINT_MAX + 1.0)));
}

}  // namespace rand_util
<commit_msg>We don't need to support win2k, so we can always use rand_s.  We can also use this for the non-secure case, which simplifies things since we shouldn't need to worry about threading anymore.<commit_after>// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/common/rand_util.h"

#include <stdlib.h>

#include "base/logging.h"

namespace rand_util {

int RandInt(int min, int max) {
  return RandIntSecure(min, max);
}

int RandIntSecure(int min, int max) {
  unsigned int number;
  // This code will not work on win2k, which we do not support.
  errno_t rv = rand_s(&number);
  DCHECK(rv == 0) << "rand_s failed with error " << rv;

  // From the rand man page, use this instead of just rand() % max, so that the
  // higher bits are used.
  return min + static_cast<int>(static_cast<double>(max - min + 1.0) *
      (number / (UINT_MAX + 1.0)));
}

}  // namespace rand_util
{'fraction_non_alphanumeric': 0.125241592578276, 'fraction_numerical': 0.012756088132972555, 'mean_word_length': 3.564373897707231, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 14, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6243371', 'n_tokens_mistral': 897, 'n_tokens_neox': 856, 'n_words': 305}