zoukankan      html  css  js  c++  java
  • 随机数的生成:给定1-n的随机数生成器randn(),生成1-m的随机数

    1.当m < n时比较简单:

    只当randn()生成的数落在1-m上时,就输出,否则继续生成;

    2.当m > n时就比较麻烦一点,

    基本思路还是和第一种情况是一样的,问题是怎样才能利用randn()生成大于n个随机数呢?

    randn2 = n * (randn() - 1) + randn()可以生成1~n2之间的数,那么只要想办法生成1-A的数,A >= m,即可,

    randn3 = n * (randn2() - 1) + randn2();

    这样就可以得到randnk 生成1-A的数,A = nk

    然后再按照第一步的方法即可生成1-m的随机数了!

     1 //m < n
     2 int randm() {
     3     int x = randn();
     4     while (x > m) {
     5         x = randn();
     6     }
     7     return x;
     8 }
     9 
    10 // m > n
    11 int A;
    12 int getK() {
    13     A = n;
    14     int k = 1;
    15     while (A < m) {
    16         A *= n;
    17         ++k;
    18     }
    19     return k;
    20 }
    21 int randA(int k) {
    22     if (k == 1)
    23         return randn();
    24     return n * (randA(k - 1) - 1) + randA(k - 1);
    25 }
    26 int randm() {
    27     x = randA();
    28     while (x > m * (A / m))
    29         x = randA();
    30     return x % m + 1;
    31 }
  • 相关阅读:
    5 November
    31 October
    K-th Path
    P1525 关押罪犯
    dp-棋盘形dp
    P1462 通往奥格瑞玛的道路
    noip2017部分题目
    洛谷orz--尺取法
    树形dp
    最短路练习
  • 原文地址:https://www.cnblogs.com/chasuner/p/random.html
Copyright © 2011-2022 走看看