Delphi6で、1〜20の数字をランダムに10個(10回でも可)ダブらないように表示させるプログラムを作りたい。

プログラムのソースを教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント10pt

今、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までの配列の内容を

表示させればいいでしょう。

id:ktoshi

ありがとうございます。

最初に1〜20のそれぞれの数字が入った20個のカゴを用意しておいて、中身だけ入れ替える感じですね。ループする回数分カゴの中身を入れ替えると。ループの回数を乱数で決める理由がよくわかりませんが、なんとなく感じはつかめました。

2004/11/19 11:27:27
id:aki73ix No.2

回答回数5224ベストアンサー獲得回数27

ポイント60pt

こんな感じになります

最小限のコメントをつけましたが分からなければ補足します

アルゴリズム

使っていない数字のうち、何番目のものを

使うかを指定します

判定には配列を使っています

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.

id:ktoshi

ありがとうございます。

完璧です。

2004/11/19 12:41:39
  • id:ktoshi
    メモ

    他の人に教えてもらったところ、
    for I := 1 to 20 do A[I] := I;
    for I := 20 downto 2 do begin
    J := trunc(Random * I) + 1;
    T := A[I]; A[I] := A[J]; A[J] := T;
    end;
    これにA[1]〜A[10]を出力する処理を足して出来ました。
    ありがとう、教えてくれた人。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません