SCV:分布を指定したランダムデータ生成

SCVではランダム生成において、モードが存在します。
今回はそれらを試してみました。

モード 説明
RAMDAM 指定分布範囲での一様なランダム生成
SCAN とりうる値で小さいものから大きいものへと生成
RANDOM_AVOID_DUPLICATE 生成可能な数値が出尽くすまで同一の値を生成しない
DISTRIBUTION scv_bag<>で確率分布を指定
  • サンプルコード
#include <scv.h>

int sc_main( int argc, char* argv[] ) {

  scv_smart_ptr<int> data_p( "data" );

  data_p->keep_only( -12, 12 );
  data_p->keep_out( -2, 2 );

  printf( "-----------------------\n");
  printf( "--- MODE:RANDOM     ---\n");
  printf( "-----------------------\n");
  data_p->set_mode(scv_extensions_if::RANDOM);
  for (int i=0; i<20; i++) {
    data_p->next();
    printf( "[SCV] data = %d\n", data_p->read() );
  }

  printf( "-----------------------\n");
  printf( "--- MODE:SCAN       ---\n");
  printf( "-----------------------\n");
  data_p->set_mode(scv_extensions_if::SCAN);
  for (int i=0; i<20; i++) {
    data_p->next();
    printf( "[SCV] data = %d\n", data_p->read() );
  }

  printf( "-----------------------------------\n");
  printf( "--- MODE:RANDOM_AVOID_DUPLICATE ---\n");
  printf( "-----------------------------------\n");
  data_p->set_mode(scv_extensions_if::RANDOM_AVOID_DUPLICATE);
  for (int i=0; i<20; i++) {
    data_p->next();
    printf( "[SCV] data = %d\n", data_p->read() );
  }

  printf( "-------------------------\n");
  printf( "--- MODE:DISTRIBUTION ---\n");
  printf( "-------------------------\n");
  data_p->set_mode(scv_extensions_if::DISTRIBUTION);
  for (int i=0; i<20; i++) {
    data_p->next();
    printf( "[SCV] data = %d\n", data_p->read() );
  }

  return 0;
}
  • 実行結果
$> ./main 

             SystemC 2.2.0 --- Jan 15 2012 14:19:56
        Copyright (c) 1996-2006 by all Contributors
                    ALL RIGHTS RESERVED
-----------------------
--- MODE:RANDOM     ---
-----------------------
[SCV] data = -7
[SCV] data = 3
[SCV] data = 6
[SCV] data = 4
[SCV] data = 11
[SCV] data = 6
[SCV] data = -11
[SCV] data = -9
[SCV] data = -7
[SCV] data = -7
[SCV] data = 4
[SCV] data = 5
[SCV] data = 12
[SCV] data = 5
[SCV] data = -9
[SCV] data = 10
[SCV] data = -10
[SCV] data = -5
[SCV] data = 4
[SCV] data = 10
-----------------------
--- MODE:SCAN       ---
-----------------------
[SCV] data = -12
[SCV] data = -11
[SCV] data = -10
[SCV] data = -9
[SCV] data = -8
[SCV] data = -7
[SCV] data = -6
[SCV] data = -5
[SCV] data = -4
[SCV] data = -3
[SCV] data = 3
[SCV] data = 4
[SCV] data = 5
[SCV] data = 6
[SCV] data = 7
[SCV] data = 8
[SCV] data = 9
[SCV] data = 10
[SCV] data = 11
[SCV] data = 12
-----------------------------------
--- MODE:RANDOM_AVOID_DUPLICATE ---
-----------------------------------
[SCV] data = 4
[SCV] data = 10
[SCV] data = -3
[SCV] data = -5
[SCV] data = 6
[SCV] data = -9
[SCV] data = 9
[SCV] data = 12
[SCV] data = -10
[SCV] data = -4
[SCV] data = 11
[SCV] data = 3
[SCV] data = 8
[SCV] data = -12
[SCV] data = -8
[SCV] data = -11
[SCV] data = -7
[SCV] data = 7
[SCV] data = -6
[SCV] data = 5
-------------------------
--- MODE:DISTRIBUTION ---
-------------------------

*** SCV_ERROR: INTROSPECTION_EMPTY_DISTRIBUTION at time 0 s in process 
    Setting mode to DISTRIBUTION for 'data' without adding a scv_bag OR scv_bag > object. The setting will be ignored.
[SCV] data = 9
[SCV] data = 3
[SCV] data = -8
[SCV] data = -10
[SCV] data = 5
[SCV] data = 10
[SCV] data = -11
[SCV] data = 11
[SCV] data = -3
[SCV] data = 6
[SCV] data = -4
[SCV] data = 4
[SCV] data = -9
[SCV] data = 12
[SCV] data = -12
[SCV] data = 8
[SCV] data = -6
[SCV] data = 7
[SCV] data = -5
[SCV] data = -7

DISTRIBUTIONモードだけエラーが出ていますが、
これは、scv_bagを指定していないためです。
scv_bagについては次回説明します。