プログラムのソースを教えてください。
今、Delphiがインストールしてないので、確認ができません。
やり方だけ 書きます。
1.20までの配列を宣言します。 例 A(20)
2.それに 1から20まで数字を入れます。
3.1000までの乱数を発生させて それをループのマックスとします。
4.20までの乱数を2つ発生させます。
5.その 2つの乱数(例 7と13)が出たら
その 乱数の配列を入れ替えます。
dummy:=A(7)
A(7):=A(13)
A(13):=dummy
6.これらを 3で発生させた乱数の数まで行います。
終わったら、1から10までの配列の内容を
表示させればいいでしょう。
こんな感じになります
最小限のコメントをつけましたが分からなければ補足します
アルゴリズム
使っていない数字のうち、何番目のものを
使うかを指定します
判定には配列を使っています
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k,l,a,b: Integer;
IChk: array[1..65536] of Integer;
//既に使用した値のチェック用
begin
Randomize;
//乱数初期化
Memo1.Lines.Clear();
//結果表示窓の初期化
a:=StrToIntDef(Edit1.Text,0);
b:=StrToIntDef(Edit2.Text,0);
// 入力値の変換
if a>65536 then
a:=65536;
if a<b then
b:=a;
// 入力値のエラーチェック
for i := 1 to a do
begin
IChk[i]:=0;
end;
// 配列初期化
j:=0;
for i := 1 to b do
begin
k:=Random(a+1-i)+1;
//箱を幾つ飛ばすか計算
l:=j;
while k>0 do
begin
if IChk[l]=0 then
Dec(k);
//使っていない箱ならカウント
if k>0 then
Inc(l);
//まだ飛ばす数が残っているなら次の箱へ
if l=a+1 then
l:=1
//配列がオーバーしたら1にもどります
end;
j:=l;
IChk[j]:=1;
//箱の使用フラグをON
Memo1.Lines.Add(IntToStr(j));
//結果出力
end;
end;
end.
ありがとうございます。
完璧です。
ありがとうございます。
最初に1〜20のそれぞれの数字が入った20個のカゴを用意しておいて、中身だけ入れ替える感じですね。ループする回数分カゴの中身を入れ替えると。ループの回数を乱数で決める理由がよくわかりませんが、なんとなく感じはつかめました。