亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1570 | 回復: 4
打印 上一主題 下一主題

[算法] 求隨機數(shù)字算法 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-10-16 14:48 |只看該作者 |倒序瀏覽
{202.205.0.0/28;205.12.0.0/26};
這是關于求隨機數(shù)的問題。
首先這是一段網(wǎng)絡段,現(xiàn)在可以將他解析出來202.205.0.0就是IP地址后面的28其實就是32-28=4,2的4次方=16,那么這段IP地址就是202.205.0.0-202.205.0.16.
所以{202.205.0.0/28;205.12.0.0/26}中應該是有16+64=80個IP地址。
現(xiàn)在要在這80個IP地址中隨機取20個IP。(我只是舉個列子,之前用容器做的,我把所有IP都放到容器中內(nèi)存不足了,其實正常數(shù)據(jù)一個段里有上萬個IP,有上萬個段,所以有幾億數(shù)據(jù))
16,64是我都能知道的,我還能知道就是首IP地址,比如202.205.0.0和205.12.0.0。
現(xiàn)在想獲得一個隨機數(shù),比如72,72在80以內(nèi),其實它的地址應該是72-16=56,那應該就是205.12.0.0+52也就是205.12.0.52,這樣想我能想明白
while(iplist!=it->second.end())
{
        unsigned long int ip_num=imask-iplist->mask;

        for(unsigned long int i=iplist->net_id+firstend;i<iplist->net_id+everyip_num-firstend;i++)
        {
                v.push_back(i);
        }
        iplist++;
        everyip_num+=ip_num;       
}
上述代碼中while循環(huán)就是循環(huán){202.205.0.0/28;205.12.0.0/26}2組數(shù)據(jù),ip_num=imask-iplist->mask;就是每組的IP數(shù),16和64,everyip_num就是總IP數(shù)80;
for(unsigned long int i=iplist->net_id;i<iplist->net_id+everyip_num;i++)
        {
                v.push_back(i);
        }
按照這種插入數(shù)據(jù)的辦法肯定有問題,數(shù)據(jù)過多會把容器爆掉,現(xiàn)在就隨機插入20個,其中iplist->net_id就是IP地址,之前是循環(huán)一組就把IP都放到容器里,現(xiàn)在是要隨機放20個,如果隨機數(shù)是76的話,代碼要怎么寫?





論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設計版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀念徽章
日期:2015-12-22 16:50:40IT運維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術圖書徽章
日期:2016-07-19 13:54:03程序設計版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
2 [報告]
發(fā)表于 2015-10-16 17:52 |只看該作者
樓主,我看不懂你的 語文描述。。。

論壇徽章:
36
子鼠
日期:2013-08-28 22:23:29黃金圣斗士
日期:2015-12-01 11:37:51程序設計版塊每日發(fā)帖之星
日期:2015-12-14 06:20:00CU十四周年紀念徽章
日期:2015-12-22 16:50:40IT運維版塊每日發(fā)帖之星
日期:2016-01-25 06:20:0015-16賽季CBA聯(lián)賽之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之福建
日期:2016-04-07 11:25:2215-16賽季CBA聯(lián)賽之青島
日期:2016-04-29 18:02:5915-16賽季CBA聯(lián)賽之北控
日期:2016-06-20 17:38:50技術圖書徽章
日期:2016-07-19 13:54:03程序設計版塊每日發(fā)帖之星
日期:2016-08-21 06:20:00
3 [報告]
發(fā)表于 2015-10-16 17:54 |只看該作者
應該是有16+64=80個IP地址。

這個64是哪里來的。。。再描述詳細點吧。。

先不管其他的,看上去隨機應該是某個范圍內(nèi),或者是幾個范圍內(nèi)的,何必使用容器。。

論壇徽章:
44
15-16賽季CBA聯(lián)賽之浙江
日期:2021-10-11 02:03:59程序設計版塊每日發(fā)帖之星
日期:2016-07-02 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2016-04-25 10:55:452016科比退役紀念章
日期:2016-04-23 00:51:2315-16賽季CBA聯(lián)賽之山東
日期:2016-04-17 12:00:2815-16賽季CBA聯(lián)賽之福建
日期:2016-04-12 15:21:2915-16賽季CBA聯(lián)賽之遼寧
日期:2016-03-24 21:38:2715-16賽季CBA聯(lián)賽之福建
日期:2016-03-18 12:13:4015-16賽季CBA聯(lián)賽之佛山
日期:2016-02-05 00:55:2015-16賽季CBA聯(lián)賽之佛山
日期:2016-02-04 21:11:3615-16賽季CBA聯(lián)賽之天津
日期:2016-11-02 00:33:1215-16賽季CBA聯(lián)賽之浙江
日期:2017-01-13 01:31:49
4 [報告]
發(fā)表于 2015-10-17 01:00 |只看該作者
本帖最后由 windoze 于 2015-10-17 01:54 編輯

嗯,lz的這個問題我還真的想了想,發(fā)現(xiàn)還是需要寫點代碼的

https://gist.github.com/windoze/ ... #file-gistfile1-txt

  1. #include <cstdint>
  2. #include <array>
  3. #include <vector>
  4. #include <iostream>
  5. #include <random>

  6. inline constexpr uint32_t subnet_mask(int len) {
  7.     return 0xFFFFFFFF >> (32-len) << (32-len);
  8. }

  9. inline uint8_t read_segment(const std::string &s, size_t start_pos) {
  10.     return 0;
  11. }

  12. struct IP_addr {
  13.     uint32_t data;
  14.    
  15.     // NOTE: Hardcoded little endian u32
  16.     uint8_t &operator[](size_t index)
  17.     { return reinterpret_cast<uint8_t *>(&data)[3-index]; }
  18.    
  19.     // NOTE: Hardcoded little endian u32
  20.     const uint8_t &operator[](size_t index) const
  21.     { return reinterpret_cast<const uint8_t *>(&data)[3-index]; }
  22.    
  23.     IP_addr mask(int len) const { return IP_addr{data & subnet_mask(len)}; }
  24.     template<typename Iterator>
  25.     static IP_addr parse(Iterator begin, Iterator end) {
  26.         IP_addr ret{0};
  27.         size_t index = 0;
  28.         while (begin!=end) {
  29.             if (isdigit((unsigned char)*begin)) {
  30.                 ret[index] *= 10;
  31.                 ret[index] += *begin - '0';
  32.             } else {
  33.                 ++index;
  34.             }
  35.             ++begin;
  36.         }
  37.         return ret;
  38.     }
  39. };

  40. inline std::ostream &operator << (std::ostream &os, const IP_addr &addr) {
  41.     os << int(addr[0]) << '.' << int(addr[1]) << '.' << int(addr[2]) << '.' << int(addr[3]);
  42.     return os;
  43. }

  44. struct IP_subnet {
  45.     IP_addr subnet_base;
  46.     int mask_len;
  47.    
  48.     size_t size() const {
  49.         // .0 and .255 are not valid IP address unless it's a single address subnet
  50.         if (mask_len==32) {
  51.             return 1;
  52.         }
  53.         return (~subnet_mask(mask_len)) + 1 - 2;
  54.     }
  55.    
  56.     IP_addr operator[](size_t index) {
  57.         if(mask_len==32)
  58.             return IP_addr{static_cast<uint32_t>(subnet_base.data+index)};
  59.         return IP_addr{static_cast<uint32_t>(subnet_base.data+index+1)};
  60.     }
  61.    
  62.     template<typename Iterator>
  63.     static IP_subnet parse(Iterator begin, Iterator end) {
  64.         IP_subnet ret{0, 0};
  65.         Iterator slash=std::find(begin, end, '/');
  66.         ret.subnet_base=IP_addr::parse(begin, slash);
  67.         ret.mask_len=0;
  68.         ++slash;
  69.         while(slash!=end) {
  70.             ret.mask_len *= 10;
  71.             ret.mask_len += *slash - '0';
  72.             ++slash;
  73.         }
  74.         ret.subnet_base=ret.subnet_base.mask(ret.mask_len);
  75.         return ret;
  76.     }
  77. };

  78. template<typename InputContainer, typename OutputContainer>
  79. size_t random_pick(InputContainer input, OutputContainer &output) {
  80.     size_t n=input.size();
  81.     size_t k=output.size();
  82.     k=std::min(n, k);
  83.     for (size_t i=0; i<k; i++) {
  84.         output[i]=input[i];
  85.     }
  86.     std::random_device rd;
  87.     std::default_random_engine e(rd());
  88.    
  89.     for (size_t i=k; i<n; i++) {
  90.         size_t j=std::uniform_int_distribution<size_t>(0, i+1)(e);
  91.         if(j<k)
  92.             output[j]=input[i];
  93.     }
  94.     return k;
  95. }

  96. inline std::ostream &operator << (std::ostream &os, const IP_subnet &subnet) {
  97.     os << subnet.subnet_base << '/' << subnet.mask_len;
  98.     return os;
  99. }

  100. int main(int argc, const char * argv[]) {
  101.     std::string ip("192.168.2.234");
  102.     IP_addr addr=IP_addr::parse(ip.begin(), ip.end());
  103.     std::cout << addr << std::endl;
  104.     std::string ip_subnet("192.168.2.58/24");
  105.     // parse會自動將這個子網(wǎng)修正為192.168.2.0/24
  106.     IP_subnet sn=IP_subnet::parse(ip_subnet.begin(), ip_subnet.end());
  107.     std::cout <<sn << std::endl;
  108.     std::cout <<sn[0] << std::endl;
  109.     std::vector<IP_addr> out(20);
  110.     random_pick(sn, out);
  111.     std::cout << "---------------------\n";
  112.     for(auto &&e: out) {
  113.         std::cout << e << std::endl;
  114.     }
  115.     return 0;
  116. }
復制代碼

論壇徽章:
44
15-16賽季CBA聯(lián)賽之浙江
日期:2021-10-11 02:03:59程序設計版塊每日發(fā)帖之星
日期:2016-07-02 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2016-04-25 10:55:452016科比退役紀念章
日期:2016-04-23 00:51:2315-16賽季CBA聯(lián)賽之山東
日期:2016-04-17 12:00:2815-16賽季CBA聯(lián)賽之福建
日期:2016-04-12 15:21:2915-16賽季CBA聯(lián)賽之遼寧
日期:2016-03-24 21:38:2715-16賽季CBA聯(lián)賽之福建
日期:2016-03-18 12:13:4015-16賽季CBA聯(lián)賽之佛山
日期:2016-02-05 00:55:2015-16賽季CBA聯(lián)賽之佛山
日期:2016-02-04 21:11:3615-16賽季CBA聯(lián)賽之天津
日期:2016-11-02 00:33:1215-16賽季CBA聯(lián)賽之浙江
日期:2017-01-13 01:31:49
5 [報告]
發(fā)表于 2015-10-17 01:53 |只看該作者
如果需要在多個網(wǎng)段中隨機挑選,用下面這段:

  1. struct IP_subnet_set {
  2.     std::vector<IP_subnet> data;
  3.    
  4.     size_t size() const {
  5.         size_t ret=0;
  6.         for(auto && sn : data) {
  7.             ret += sn.size();
  8.         }
  9.         return ret;
  10.     }
  11.    
  12.     void add_subnet(const IP_subnet &sn) {
  13.         data.push_back(sn);
  14.     }
  15.    
  16.     struct const_iterator {
  17.         const IP_subnet_set *owner=nullptr;
  18.         size_t sn_index=0;
  19.         size_t ip_index=0;
  20.         const_iterator(const IP_subnet_set *p)
  21.         : owner(p)
  22.         , sn_index(0)
  23.         , ip_index(0)
  24.         {}
  25.         
  26.         const_iterator(const IP_subnet_set *p, size_t sni, size_t ipi)
  27.         : owner(p)
  28.         , sn_index(sni)
  29.         , ip_index(ipi)
  30.         {}
  31.         
  32.         void next() {
  33.             if(sn_index>=owner->data.size()) { owner=nullptr; return; }
  34.             ip_index++;
  35.             if(ip_index==owner->data[sn_index].size()) {
  36.                 ip_index=0;
  37.                 sn_index++;
  38.             }
  39.         }
  40.         
  41.         bool ended() const {
  42.             return (!owner)
  43.             || (sn_index>=owner->data.size())
  44.             || ((sn_index==owner->data.size()-1) && (ip_index==owner->data[sn_index].size()));
  45.         }
  46.         
  47.         const_iterator operator++() {
  48.             next();
  49.             return *this;
  50.         }
  51.         
  52.         IP_addr operator*() const {
  53.             return owner->data[sn_index][ip_index];
  54.         }
  55.         
  56.         bool operator==(const const_iterator &other) const {
  57.             return (ended()&&other.ended())
  58.             || (owner==other.owner && sn_index==other.sn_index && ip_index==other.ip_index);
  59.         }
  60.         
  61.         bool operator!=(const const_iterator &other) const {
  62.             return !operator==(other);
  63.         }
  64.     };
  65.    
  66.     const_iterator begin() const {
  67.         return const_iterator(this);
  68.     }
  69.    
  70.     const_iterator end() const {
  71.         return const_iterator(nullptr);
  72.     }
  73.    
  74.     template<typename OutputContainer>
  75.     size_t random_pick(OutputContainer &output) {
  76.         size_t n=size();
  77.         size_t k=output.size();
  78.         k=std::min(n, k);
  79.         const_iterator it=begin();
  80.         for (size_t i=0; i<k; i++, ++it) {
  81.             output[i]=*it;
  82.         }
  83.         std::random_device rd;
  84.         std::default_random_engine e(rd());
  85.         
  86.         for (size_t i=k; i<n; i++, ++it) {
  87.             size_t j=std::uniform_int_distribution<size_t>(0, i+1)(e);
  88.             if(j<k) output[j]=*it;
  89.         }
  90.         return k;
  91.     }
  92. };
復制代碼
使用方法:

  1.     IP_subnet_set sns;
  2.     sns.add_subnet(IP_subnet::parse("192.168.2.58/24"));
  3.     sns.add_subnet(IP_subnet::parse("192.168.18.58/24"));
  4.     sns.add_subnet(IP_subnet::parse("10.0.0.0/16"));
  5.     std::vector<IP_addr> out(200);
  6.     sns.random_pick(out);
復制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP