Thứ Tư, 25 tháng 12, 2013

Sinh ngẫu nhiên tỉ lệ



Sinh ngẫu nhiên tỉ lệ



               Sinh ngẫu nhiên cho mảng nguyên a có n phần tử tạo thành hai đoạn liên tiếp có tổng các phần tử trong một đoạn gấp k lần tổng các phần tử của đoạn kia.

Thuật toán do gia sư tin học hướng dẫn:
1. Sinh ngẫu nhiên tổng t1 :=  random(n) + 1.
2. Tính t2 := k*t1.
3. Gieo đồng xu bằng cách gọi random(2) để xác định tổng nào trong số t1 và t2 được chọn trước.
4. Sinh random(n div 2)+1 phần tử cho đoạn thứ nhất sao cho tổng các phần tử của đoạn này bằng t1 (xem bài 2.4).
5. Sinh nốt các phần tử cho đoạn thứ hai sao cho tổng các phần tử của đoạn này bằng t2.
(*  Pascal  *)
program K2gen;
uses crt;
const MN = 1000;
var a: array[1..MN] of integer;
(*---------------------------
       Sinh du lieu
-----------------------------*)
procedure Gen(n,k:integer);
var i,j,t1,t2:integer;
begin
  if (k < 1) OR (k > n) then exit;
  t1 := random(n) + 1;
  {tong mot doan; tong doan con lai = k*t1 }
  {chon ngau nhien doan co tong lon dat truoc hay sau }
  if random(2)= 0 then t2 := k*t1
  else
begin
  t2 := t1; t1 := k*t2;
end;
  i := 0; {sinh doan thu nhat}
  for j := 1 to random(n div 2) do
  begin
   inc(i); a[i] := random(t1);
   t1 := t1 – a[i];
  end;
  inc(i); a[i] := t1;
  while i < n do {sinh doan thu hai }
  begin
    inc(i); a[i]:= random(t2);
    t2 := t2 – a[i];
  end;
  a[n] := a[n] + t2;
end;
procedure Xem(n: integer); tự viết
procedure Test;
var n,k: integer;
begin  
  randomize;
  repeat
    n := random(30) + 1;
    k := random(8) + 1;
    write(' n = ',n,' k = ',k);
    Gen(n,k); Xem(n);
  until ReadKey = #27;
end;
BEGIN
Test;
END.

Không có nhận xét nào:

Đăng nhận xét