無作為抽出プログラム



[ 簡単な説明 ]

無作為抽出用の関数です。int 型データのみ準備しました。
(通常、無作為抽出を使用するのは、順番を決める等のケースで、int 型で十分とみました。long 型が必要な場合は、int 型を変更して自分で作成してみて下さい。)

本関数を使用する前に、初期設定用関数 init_pickup( )を実行する必要があります。
init_pickup( )は、一様乱数の初期設定用関数名、乱数生成関数名、乱数の種を引数に与えて実行して下さい。

pickup( )は、配列サイズ、抽出する要素数、無作為抽出データのint 型配列名を引数として実行します。

無作為抽出関数
pickup( ) int 型データ用

プログラム・ソース("pickup.c")           top (トップに戻る)
/*		pickup.c	無作為抽出		*/
#include <stdio.h>
#include "random.h"

void init_pickup(void (*init)(long s), double (*rnd)(void), long seed)
{
	init(seed);
	_rand = rnd;
}

void pickup(int m, int n, int *pick)
{
	int i, *p;

	if(m < n || n < 1)
	{
		fprintf(stderr, "Error : illegal input  in pickup()\n");
		return;
	}
	p = pick;
	i = 1;
	do
	{
		if(_rand() < (double)n / (double)m--)
		{
			*p++ = i;
			n--;
		}
		i++;
	} while(n);
}