gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Seeding random sequence
0 2 0
default
2 files changed with 28 insertions and 0 deletions:
↑ Collapse diff ↑
Ignore white space 128 line context
... ...
@@ -514,128 +514,148 @@
514 514
  /// LEMON provides a global instance of the random number
515 515
  /// generator which name is \ref lemon::rnd "rnd". Usually it is a
516 516
  /// good programming convenience to use this global generator to get
517 517
  /// random numbers.
518 518
  class Random {
519 519
  private:
520 520

	
521 521
    // Architecture word
522 522
    typedef unsigned long Word;
523 523
    
524 524
    _random_bits::RandomCore<Word> core;
525 525
    _random_bits::BoolProducer<Word> bool_producer;
526 526
    
527 527

	
528 528
  public:
529 529

	
530 530
    /// \brief Default constructor
531 531
    ///
532 532
    /// Constructor with constant seeding.
533 533
    Random() { core.initState(); }
534 534

	
535 535
    /// \brief Constructor with seed
536 536
    ///
537 537
    /// Constructor with seed. The current number type will be converted
538 538
    /// to the architecture word type.
539 539
    template <typename Number>
540 540
    Random(Number seed) { 
541 541
      _random_bits::Initializer<Number, Word>::init(core, seed);
542 542
    }
543 543

	
544 544
    /// \brief Constructor with array seeding
545 545
    ///
546 546
    /// Constructor with array seeding. The given range should contain
547 547
    /// any number type and the numbers will be converted to the
548 548
    /// architecture word type.
549 549
    template <typename Iterator>
550 550
    Random(Iterator begin, Iterator end) { 
551 551
      typedef typename std::iterator_traits<Iterator>::value_type Number;
552 552
      _random_bits::Initializer<Number, Word>::init(core, begin, end);
553 553
    }
554 554

	
555 555
    /// \brief Copy constructor
556 556
    ///
557 557
    /// Copy constructor. The generated sequence will be identical to
558 558
    /// the other sequence. It can be used to save the current state
559 559
    /// of the generator and later use it to generate the same
560 560
    /// sequence.
561 561
    Random(const Random& other) {
562 562
      core.copyState(other.core);
563 563
    }
564 564

	
565 565
    /// \brief Assign operator
566 566
    ///
567 567
    /// Assign operator. The generated sequence will be identical to
568 568
    /// the other sequence. It can be used to save the current state
569 569
    /// of the generator and later use it to generate the same
570 570
    /// sequence.
571 571
    Random& operator=(const Random& other) {
572 572
      if (&other != this) {
573 573
        core.copyState(other.core);
574 574
      }
575 575
      return *this;
576 576
    }
577 577

	
578
    /// \brief Seeding random sequence
579
    ///
580
    /// Seeding the random sequence. The current number type will be
581
    /// converted to the architecture word type.
582
    template <typename Number>
583
    void seed(Number seed) { 
584
      _random_bits::Initializer<Number, Word>::init(core, seed);
585
    }
586

	
587
    /// \brief Seeding random sequence
588
    ///
589
    /// Seeding the random sequence. The given range should contain
590
    /// any number type and the numbers will be converted to the
591
    /// architecture word type.
592
    template <typename Iterator>
593
    void seed(Iterator begin, Iterator end) { 
594
      typedef typename std::iterator_traits<Iterator>::value_type Number;
595
      _random_bits::Initializer<Number, Word>::init(core, begin, end);
596
    }
597

	
578 598
    /// \brief Returns a random real number from the range [0, 1)
579 599
    ///
580 600
    /// It returns a random real number from the range [0, 1). The
581 601
    /// default Number type is \c double.
582 602
    template <typename Number>
583 603
    Number real() {
584 604
      return _random_bits::RealConversion<Number, Word>::convert(core);
585 605
    }
586 606

	
587 607
    double real() {
588 608
      return real<double>();
589 609
    }
590 610

	
591 611
    /// \brief Returns a random real number the range [0, b)
592 612
    ///
593 613
    /// It returns a random real number from the range [0, b).
594 614
    template <typename Number>
595 615
    Number real(Number b) { 
596 616
      return real<Number>() * b; 
597 617
    }
598 618

	
599 619
    /// \brief Returns a random real number from the range [a, b)
600 620
    ///
601 621
    /// It returns a random real number from the range [a, b).
602 622
    template <typename Number>
603 623
    Number real(Number a, Number b) { 
604 624
      return real<Number>() * (b - a) + a; 
605 625
    }
606 626

	
607 627
    /// \brief Returns a random real number from the range [0, 1)
608 628
    ///
609 629
    /// It returns a random double from the range [0, 1).
610 630
    double operator()() {
611 631
      return real<double>();
612 632
    }
613 633

	
614 634
    /// \brief Returns a random real number from the range [0, b)
615 635
    ///
616 636
    /// It returns a random real number from the range [0, b).
617 637
    template <typename Number>
618 638
    Number operator()(Number b) { 
619 639
      return real<Number>() * b; 
620 640
    }
621 641

	
622 642
    /// \brief Returns a random real number from the range [a, b)
623 643
    ///
624 644
    /// It returns a random real number from the range [a, b).
625 645
    template <typename Number>
626 646
    Number operator()(Number a, Number b) { 
627 647
      return real<Number>() * (b - a) + a; 
628 648
    }
629 649

	
630 650
    /// \brief Returns a random integer from a range
631 651
    ///
632 652
    /// It returns a random integer from the range {0, 1, ..., b - 1}.
633 653
    template <typename Number>
634 654
    Number integer(Number b) {
635 655
      return _random_bits::Mapping<Number, Word>::map(core, b);
636 656
    }
637 657

	
638 658
    /// \brief Returns a random integer from a range
639 659
    ///
640 660
    /// It returns a random integer from the range {a, a + 1, ..., b - 1}.
641 661
    template <typename Number>
Ignore white space 128 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/random.h>
20 20
#include "test_tools.h"
21 21

	
22 22
///\file \brief Test cases for random.h
23 23
///
24 24
///\todo To be extended
25 25
///
26 26

	
27
int seed_array[] = {1, 2};
28

	
27 29
int main()
28 30
{
29 31
  double a=lemon::rnd();
30 32
  check(a<1.0&&a>0.0,"This should be in [0,1)");
31 33
  a=lemon::rnd.gauss();
32 34
  a=lemon::rnd.gamma(3.45,0);
33 35
  a=lemon::rnd.gamma(4);
34 36
  //Does gamma work with integer k?
35 37
  a=lemon::rnd.gamma(4.0,0);
36 38
  a=lemon::rnd.poisson(.5);
39

	
40
  lemon::rnd.seed(100);
41
  lemon::rnd.seed(seed_array, seed_array + 
42
		  (sizeof(seed_array) / sizeof(seed_array[0])));
43

	
44
  return 0;
37 45
}
0 comments (0 inline)